LeetCode第25场双周赛


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 的操作得到的结果分别为 ab

请你返回 ab最大差值

示例 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.检查一个字符串是否可以打破另一个字符串

题目

给你两个字符串 s1s2 ,它们长度相等,请你检查是否存在一个 s1 的排列可以打破 s2 的一个排列,或者是否存在一个 s2 的排列可以打破 s1 的一个排列。

字符串 x 可以打破字符串 y (两者长度都为 n )需满足对于所有 i(在 0n - 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] ,则满足条件。考虑反面情况,若 s1s2 中的元素排序后,所有相同位置的 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 种不同的帽子,帽子编号从 140

给你一个整数列表的列表 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] 包含一个数字互不相同的整数列表。

思路


文章作者: 陶英
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 陶英 !
评论
 上一篇
LeetCode第187场周赛 LeetCode第187场周赛
1.旅行终点站题目给你一份旅游线路图,该线路图中的旅行线路用数组 paths 表示,其中 paths[i] = [cityAi, cityBi] 表示该线路将会从 cityAi 直接前往 cityBi 。请你找出这次旅行的终点站,即没有任何
2020-05-03
下一篇 
LeetCode第23场双周赛 LeetCode第23场双周赛
1.统计最大组的数目题目给你一个整数 n 。请你先求出从 1 到 n 的每个整数 10 进制表示下的数位和(每一位上的数字相加),然后把数位和相等的数字放到同一个组中。 请你统计每个组中的数字数目,并返回数字数目并列最多的组有多少个。 示例
2020-04-06
  目录