LeetCode 383. 赎金信 / 372. 超级次方 / 1816. 截断句子

Posted Zephyr丶J

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 383. 赎金信 / 372. 超级次方 / 1816. 截断句子相关的知识,希望对你有一定的参考价值。

383. 赎金信

2021.12.5 每日一题

题目描述

为了不在赎金信中暴露字迹,从杂志上搜索各个需要的字母,组成单词来表达意思。

给你一个赎金信 (ransomNote) 字符串和一个杂志(magazine)字符串,判断 ransomNote 能不能由 magazines 里面的字符构成。

如果可以构成,返回 true ;否则返回 false 。

magazine 中的每个字符只能在 ransomNote 中使用一次。

示例 1:

输入:ransomNote = “a”, magazine = “b”
输出:false

示例 2:

输入:ransomNote = “aa”, magazine = “ab”
输出:false

示例 3:

输入:ransomNote = “aa”, magazine = “aab”
输出:true

提示:

1 <= ransomNote.length, magazine.length <= 10^5
ransomNote 和 magazine 由小写英文字母组成

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/ransom-note
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路

几个月前刚出过这个每日一题

class Solution 
    public boolean canConstruct(String ransomNote, String magazine) 
        int lm = magazine.length();
        int lr = ransomNote.length();
        if(lr > lm)
            return false;
        int[] count = new int[26];
        for(int i = 0; i < lm; i++)
            count[magazine.charAt(i) - 'a']++;
        

        for(int i = 0; i < lr; i++)
            if(--count[ransomNote.charAt(i) - 'a'] < 0)
                return false;
        
        return true;
    

372. 超级次方

2021.12.5 每日一题

题目描述

你的任务是计算 ab 对 1337 取模,a 是一个正整数,b 是一个非常大的正整数且会以数组形式给出。

示例 1:

输入:a = 2, b = [3]
输出:8

示例 2:

输入:a = 2, b = [1,0]
输出:1024

示例 3:

输入:a = 1, b = [4,3,3,8,5,2]
输出:1

示例 4:

输入:a = 2147483647, b = [2,0,0]
输出:1198

提示:

1 <= a <= 2^31 - 1
1 <= b.length <= 2000
0 <= b[i] <= 9
b 不含前导 0

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/super-pow
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路

因为每次只是算一位数,最大也就是乘9次,所以没有用快速幂

class Solution 
    static int MOD = 1337;
    public int superPow(int a, int[] b) 
        //快速幂,但是b太大了,怎么快速呢
        //每次计算一位,个十百千这种
        int l = b.length;
        int base = a;
        int res = 1;
        for(int i = l - 1; i >= 0; i--)
            int nextbase = base;
            for(int j = 1; j <= 9; j++)
                if(j == b[i])
                    res = (res % MOD) * (nextbase % MOD) % MOD;
                nextbase = (nextbase % MOD) * (base % MOD) % MOD;
                //System.out.println(nextbase);
            
            base = nextbase;
        
        return res;
    

1816. 截断句子

题目描述

句子 是一个单词列表,列表中的单词之间用单个空格隔开,且不存在前导或尾随空格。每个单词仅由大小写英文字母组成(不含标点符号)。

例如,“Hello World”、“HELLO” 和 “hello world hello world” 都是句子。
给你一个句子 s​​​​​​ 和一个整数 k​​​​​​ ,请你将 s​​ 截断 ​,​​​使截断后的句子仅含 前 k​​​​​​ 个单词。返回 截断 s​​​​​​ 后得到的句子。

示例 1:

输入:s = “Hello how are you Contestant”, k = 4
输出:“Hello how are you”
解释:
s 中的单词为 [“Hello”, “how” “are”, “you”, “Contestant”]
前 4 个单词为 [“Hello”, “how”, “are”, “you”]
因此,应当返回 “Hello how are you”

示例 2:

输入:s = “What is the solution to this problem”, k = 4
输出:“What is the solution”
解释:
s 中的单词为 [“What”, “is” “the”, “solution”, “to”, “this”, “problem”]
前 4 个单词为 [“What”, “is”, “the”, “solution”]
因此,应当返回 “What is the solution”

示例 3:

输入:s = “chopper is not a tanuki”, k = 5
输出:“chopper is not a tanuki”

提示:

1 <= s.length <= 500
k 的取值范围是 [1, s 中单词的数目]
s 仅由大小写英文字母和空格组成
s 中的单词之间由单个空格隔开
不存在前导或尾随空格

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/truncate-sentence
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路

百分之十…

class Solution 
    public String truncateSentence(String s, int k) 
        String[] ss = s.split(" ");
        String res = "";
        for(int i = 0; i < k; i++)
            if(i < k - 1)
                res += ss[i] + " ";
            else
                res += ss[i];
        
        return res;
    

65%

class Solution 
    public String truncateSentence(String s, int k) 
        int l = s.length();
        int idx = 0;
        while(idx < l && k > 0)
            while(idx < l && (Character.isLowerCase(s.charAt(idx)) || Character.isUpperCase(s.charAt(idx))))
                idx++;
            
            idx++;
            k--;
        
        return s.substring(0, --idx);
    

100%

class Solution 
    public String truncateSentence(String s, int k) 
        int l = s.length();
        int idx = 0;
        while(idx < l)
            if(s.charAt(idx) == ' ')
                k--;
            if(k == 0)
                break;
            idx++;
        
        return s.substring(0, idx);
    

以上是关于LeetCode 383. 赎金信 / 372. 超级次方 / 1816. 截断句子的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode:383. 赎金信————简单

每日leetcode-数组-383. 赎金信

Leetcode刷题100天—383. 赎金信( 数组)—day79

LeetCode 383 赎金信

LeetCode 383 赎金信[数组] HERODING的LeetCode之路

Leetcode刷题100天—383. 赎金信(字符串)—day27