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刷题100天—383. 赎金信( 数组)—day79