【周赛总结】双周赛109

简介: 【周赛总结】双周赛109

双周赛109

37分钟AK,T3初始值写错WA一次,满足

检查数组是否是好的【LC2784】

给你一个整数数组 nums ,如果它是数组 base[n] 的一个排列,我们称它是个 数组。

base[n] = [1, 2, ..., n - 1, n, n] (换句话说,它是一个长度为 n + 1 且包含 1

 n - 1 恰好各一次,包含 n 两次的一个数组)。比方说,base[1] = [1, 1]base[3] = [1, 2, 3, 3]

如果数组是一个好数组,请你返回 true ,否则返回 false

**注意:**数组的排列是这些数字按任意顺序排布后重新得到的数组。

  • 思路:排序+模拟
    排序后的好数组满足以下条件

image.png

class Solution {
    public boolean isGood(int[] nums) {
        int n = nums.length;
        Arrays.sort(nums);
        for (int i = 0; i < n - 1; i++){
            if (i + 1 != nums[i]){
                return false;
            }
        }
        return nums[n - 1] == n - 1;
    }
}

image.png

字符串中的元音字母排序【LC2785】

给你一个下标从 0 开始的字符串 s ,将 s 中的元素重新 排列 得到新的字符串 t ,它满足:

  • 所有辅音字母都在原来的位置上。更正式的,如果满足 0 <= i < s.length 的下标 i 处的 s[i] 是个辅音字母,那么 t[i] = s[i]
  • 元音字母都必须以他们的 ASCII 值按 非递减 顺序排列。更正式的,对于满足 0 <= i < j < s.length 的下标 ij ,如果 s[i]s[j] 都是元音字母,那么 t[i] 的 ASCII 值不能大于 t[j] 的 ASCII 值。

请你返回结果字母串。

元音字母为 'a''e''i''o''u' ,它们可能是小写字母也可能是大写字母,辅音字母是除了这 5 个字母以外的所有字母。


  • 思路:模拟+排序
    先遍历一遍字符串,统计元音字符,将其按升序排序;再遍历一遍字符串,生成结果,辅音字母直接添加进sb中,元音字母按升序添加进sb中
  • 实现
class Solution {
    public String sortVowels(String s) {
        int n = s.length();
        StringBuilder sb = new StringBuilder();
        boolean[] isVowel = new boolean[n];
        List<Character> vowels = new ArrayList<>();
        for (int i = 0; i < n; i++){
            char c = s.charAt(i);
            if (isVowel(c)){
                isVowel[i] = true;
                vowels.add(c);
            }
        }
        Collections.sort(vowels, (c1, c2) -> c1 - c2);
        int j = 0;
        for (int i = 0; i < n; i++){
            if (isVowel[i]){
                sb.append(vowels.get(j));
                j++;
            }else{
                sb.append(s.charAt(i));
            }
        }
        return sb.toString();
    }
    public boolean isVowel(char c){
        return c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u' || 
                c == 'A' || c == 'E' || c == 'I' || c == 'O' || c == 'U';
    }
}

image.png

访问数组中的位置使分数最大【LC2786】

给你一个下标从 0 开始的整数数组 nums 和一个正整数 x

一开始 在数组的位置 0 处,你可以按照下述规则访问数组中的其他位置:

  • 如果你当前在位置 i ,那么你可以移动到满足 i < j任意 位置 j
  • 对于你访问的位置 i ,你可以获得分数 nums[i]
  • 如果你从位置 i 移动到位置 jnums[i]nums[j]奇偶性 不同,那么你将失去分数 x

请你返回你能得到的 最大 得分之和。

注意 ,你一开始的分数为 nums[0]

image.png

image.png

class Solution {
    public long maxScore(int[] nums, int x) {
        long odd = Long.MIN_VALUE, even = Long.MIN_VALUE;
        int n = nums.length;
        long res = nums[0];
        if (nums[0] % 2 == 0){
            even = nums[0];
        }else{
            odd = nums[0];
        }
        for (int i = 1; i < n; i++){
            if (nums[i] % 2 == 0){
                even = Math.max(even, even + nums[i]);
                // if (odd != Long.MIN_VALUE){
                    even = Math.max(odd + nums[i] - x, even);
                // }   
                res = Math.max(res, even);
            }else{
                odd = Math.max(odd, odd + nums[i]);
                // if (even != Long.MIN_VALUE){
                    odd = Math.max(even + nums[i] - x, odd);                
                // }    
                res = Math.max(res, odd);
            }
        }
        return res;
    }
}

image.png

将一个数字表示成幂的和的方案数【LC2787】

给你两个 整数 nx

请你返回将 n 表示成一些 互不相同 正整数的 x 次幂之和的方案数。换句话说,你需要返回互不相同整数 [n1, n2, ..., nk] 的集合数目,满足 n = n1x + n2x + ... + nkx

由于答案可能非常大,请你将它对 109 + 7 取余后返回。

比方说,n = 160x = 3 ,一个表示 n 的方法是 n = 23 + 33 + 53

image.png

class Solution {
    public static final int MOD = (int)(1e9 + 7);
    public int numberOfWays(int n, int x) {
        List<Integer> nums = new ArrayList<>();// 所有可能的x的幂
        int res = 0;
        for (int i = 1; Math.pow(i, x) <= n; i++){
            nums.add((int)Math.pow(i, x));
        }
        // 01背包问题,不可重复
        int[] dp = new int[n + 1];
        dp[0] = 1;
        for (int i = 0; i < nums.size(); i++){
            for (int j = n; j >= nums.get(i); j--){
                dp[j] = (dp[j] + dp[j - nums.get(i)]) % MOD;
            }
        }
        return dp[n];
    }
}

image.png

目录
相关文章
|
11月前
|
容器
天梯赛备战(三)
天梯赛备战(三)
【2022天梯赛】L1-8 静静的推荐
【2022天梯赛】L1-8 静静的推荐
|
6月前
Leetcode第123场双周赛
在LeetCode的第123场双周赛中,参赛者需解决三个问题。第一题涉及根据给定数组构建三角形并判断其类型,如等边、等腰或不等边,代码实现通过排序简化条件判断。第二题要求找出满足差值为k的好子数组的最大和,解决方案利用前缀和与哈希表提高效率。第三题则需要计算点集中满足特定条件的点对数量,解题策略是对点按坐标排序并检查点对是否满足要求。
25 1
【2022天梯赛】L1-7 机工士姆斯塔迪奥
【2022天梯赛】L1-7 机工士姆斯塔迪奥
|
6月前
【周赛总结】17-双周赛108
【周赛总结】17-双周赛108
53 0
【Leetcode】- 第 29 场双周赛
【Leetcode】- 第 29 场双周赛
|
11月前
|
存储 编译器 C++
天梯赛备战(一)c++
天梯赛备战(一)c++
102 0
|
11月前
|
存储 iOS开发 容器
天梯赛备战(二)
天梯赛备战(二)
|
存储 数据安全/隐私保护