1.拥有最多糖果的孩子
题目
给你一个数组 candies
和一个整数 extraCandies
,其中 candies[i]
代表第 i
个孩子拥有的糖果数目。
对每一个孩子,检查是否存在一种方案,将额外的 extraCandies
个糖果分配给孩子们之后,此孩子有 最多 的糖果。注意,允许有多个孩子同时拥有 最多 的糖果数目。
示例 1:
输入:candies = [2,3,5,1,3], extraCandies = 3
输出:[true,true,true,false,true]
解释:
孩子 1 有 2 个糖果,如果他得到所有额外的糖果(3个),那么他总共有 5 个糖果,他将成为拥有最多糖果的孩子。
孩子 2 有 3 个糖果,如果他得到至少 2 个额外糖果,那么他将成为拥有最多糖果的孩子。
孩子 3 有 5 个糖果,他已经是拥有最多糖果的孩子。
孩子 4 有 1 个糖果,即使他得到所有额外的糖果,他也只有 4 个糖果,无法成为拥有糖果最多的孩子。
孩子 5 有 3 个糖果,如果他得到至少 2 个额外糖果,那么他将成为拥有最多糖果的孩子。
示例 2:
输入:candies = [4,2,1,1,2], extraCandies = 1
输出:[true,false,false,false,false]
解释:只有 1 个额外糖果,所以不管额外糖果给谁,只有孩子 1 可以成为拥有糖果最多的孩子。
示例 3:
输入:candies = [12,1,12], extraCandies = 10
输出:[true,false,true]
提示:
2 <= candies.length <= 100
1 <= candies[i] <= 100
1 <= extraCandies <= 50
思路
理解题意即可,若 candies
的元素 $candies[i]+extraCandies< \max_{0\le i \le candies.length}(candies[i])$ ,则无法成为拥有最多的糖果的孩子,对应为false
,否则为true
class Solution {
public List<Boolean> kidsWithCandies(int[] candies, int extraCandies) {
int max = -1;
for(int num : candies) {
max = Math.max(max, num);
}
List<Boolean> list = new ArrayList<>();
for(int num : candies) {
if(num + extraCandies < max) {
list.add(false);
} else {
list.add(true);
}
}
return list;
}
}
2.改变一个整数能得到的最大差值
题目
给你一个整数 num
。你可以对它进行如下步骤恰好 两次 :
- 选择一个数字
x (0 <= x <= 9)
. - 选择另一个数字
y (0 <= y <= 9)
。数字y
可以等于x
。 - 将
num
中所有出现x
的数位都用y
替换。 - 得到的新的整数 不能 有前导 0 ,得到的新整数也 不能 是 0 。
令两次对 num
的操作得到的结果分别为 a
和 b
。
请你返回 a
和 b
的 最大差值 。
示例 1:
输入:num = 555
输出:888
解释:第一次选择 x = 5 且 y = 9 ,并把得到的新数字保存在 a 中。
第二次选择 x = 5 且 y = 1 ,并把得到的新数字保存在 b 中。
现在,我们有 a = 999 和 b = 111 ,最大差值为 888
示例 2:
输入:num = 9
输出:8
解释:第一次选择 x = 9 且 y = 9 ,并把得到的新数字保存在 a 中。
第二次选择 x = 9 且 y = 1 ,并把得到的新数字保存在 b 中。
现在,我们有 a = 9 和 b = 1 ,最大差值为 8
示例 3:
输入:num = 123456
输出:820000
示例 4:
输入:num = 10000
输出:80000
示例 5:
输入:num = 9288
输出:8700
提示:
1 <= num <= 10^8
思路
首先将整数 num
转换成字符串方便处理,目标是选择 num
中的某一位数字,将所有数位上与之相等的数字替换,分别得到最大值 max
和最小值 min
,返回差值。题目要求,得到的新的整数 不能 有前导 0 ,得到的新整数也 不能 是 0。
分类讨论,为了得到 max
,需要尽量将较高位的数字替换为 9
,因此只要找到 num
中从高位到低位第一个不为 9
的数字即可;为了得到 min
,当最高位不为 1
时,最高位的数字即为目标数字,将其替换为 1
;若最高位为1,则从高位到低位找到第一个不为 1
且 不为 0
的数字,将其替换为 0
。
class Solution {
public int maxDiff(int num) {
if(num < 10) {
return 8;
}
String s = String.valueOf(num);
char[] str = s.toCharArray();
char[] min = new char[str.length];
char[] max = new char[str.length];
char c1;
boolean isFirst = false;
char c2;
if(str[0] == '1') {
int index = 1;
c1 = str[index];
while(index < str.length) {
if(c1 != '1' && c1 != '0') {
break;
}
c1 = str[index++];
}
} else {
c1 = str[0];
isFirst = true;
}
int index = 0;
c2 = str[index];
while(index < str.length) {
if(c2 != '9') {
break;
}
c2 = str[index++];
}
for(int i = 0; i < str.length; i++) {
if(c1 == '1') {
min[i] = str[i];
} else {
if(str[i] == c1) {
if(isFirst) {
min[i] = '1';
} else {
min[i] = '0';
}
} else {
min[i] = str[i];
}
}
if(str[i] == c2) {
max[i] = '9';
} else {
max[i] = str[i];
}
}
int ans = 0;
for(int i = 0; i < str.length; i++) {
ans = 10*ans + (max[i] - min[i]);
}
return ans;
}
}
3.检查一个字符串是否可以打破另一个字符串
题目
给你两个字符串 s1
和 s2
,它们长度相等,请你检查是否存在一个 s1
的排列可以打破 s2
的一个排列,或者是否存在一个 s2
的排列可以打破 s1
的一个排列。
字符串 x
可以打破字符串 y
(两者长度都为 n
)需满足对于所有 i
(在 0
到 n - 1
之间)都有 x[i] >= y[i]
(字典序意义下的顺序)。
示例 1:
输入:s1 = "abc", s2 = "xya"
输出:true
解释:"ayx" 是 s2="xya" 的一个排列,"abc" 是字符串 s1="abc" 的一个排列,且 "ayx" 可以打破 "abc" 。
示例 2:
输入:s1 = "abe", s2 = "acd"
输出:false
解释:s1="abe" 的所有排列包括:"abe","aeb","bae","bea","eab" 和 "eba" ,s2="acd" 的所有排列包括:"acd","adc","cad","cda","dac" 和 "dca"。然而没有任何 s1 的排列可以打破 s2 的排列。也没有 s2 的排列能打破 s1 的排列。
示例 3:
输入:s1 = "leetcodee", s2 = "interview"
输出:true
提示:
s1.length == n
s2.length == n
1 <= n <= 10^5
- 所有字符串都只包含小写英文字母。
思路
理解题意即可,若 s1
的一个排列中每个元素 s1[i]
都 >=
(或<=
) s2
的一个排列中每个元素 s2[i]
,则满足条件。考虑反面情况,若 s1
和 s2
中的元素排序后,所有相同位置的 s1[i]
和 s2[i]
无法同时满足 s1[i]>=s2[i]
(或s1[i]<=s2[i]
),则不满足条件。
class Solution {
public boolean checkIfCanBreak(String s1, String s2) {
int n = s1.length();
char[] str1 = s1.toCharArray();
char[] str2 = s2.toCharArray();
Arrays.sort(str1);
Arrays.sort(str2);
int flag = 0;
for(int i = 0; i < n; i++) {
if(str1[i] != str2[i]) {
flag = str1[i] > str2[i] ? 0 : 1;
}
}
for(int i = 0; i < n; i++) {
if(flag == 0 && str1[i] < str2[i]) {
return false;
}
if(flag == 1 && str1[i] > str2[i]) {
return false;
}
}
return true;
}
}
4.每个人戴不同帽子的方案数
题目
总共有 n
个人和 40
种不同的帽子,帽子编号从 1
到 40
。
给你一个整数列表的列表 hats
,其中 hats[i]
是第 i
个人所有喜欢帽子的列表。
请你给每个人安排一顶他喜欢的帽子,确保每个人戴的帽子跟别人都不一样,并返回方案数。
由于答案可能很大,请返回它对 10^9 + 7
取余后的结果。
示例 1:
输入:hats = [[3,4],[4,5],[5]]
输出:1
解释:给定条件下只有一种方法选择帽子。
第一个人选择帽子 3,第二个人选择帽子 4,最后一个人选择帽子 5。
示例 2:
输入:hats = [[3,5,1],[3,5]]
输出:4
解释:总共有 4 种安排帽子的方法:
(3,5),(5,3),(1,3) 和 (1,5)
示例 3:
输入:hats = [[1,2,3,4],[1,2,3,4],[1,2,3,4],[1,2,3,4]]
输出:24
解释:每个人都可以从编号为 1 到 4 的帽子中选。
(1,2,3,4) 4 个帽子的排列方案数为 24 。
示例 4:
输入:hats = [[1,2,3],[2,3,5,6],[1,3,7,9],[1,8,9],[2,5,7]]
输出:111
提示:
n == hats.length
1 <= n <= 10
1 <= hats[i].length <= 40
1 <= hats[i][j] <= 40
hats[i]
包含一个数字互不相同的整数列表。