2022-10-16 第 315 场周赛

2022-10-16 第 315 场周赛

6204. 与对应负数同时存在的最大正整数

哈希

class Solution {
    public int findMaxK(int[] nums) {
        int ans =-1;
        Set<Integer> set = new HashSet<>();
        for (int num : nums) {
            if (set.contains(-num)) {
                ans = Math.max(ans,Math.abs(num));
            } else {
                set.add(num);
            }
        }
        return ans;
    }
}

6205. 反转之后不同整数的数目

暴力

class Solution {
    public int countDistinctIntegers(int[] nums) {
        // Set set = new HashSet<>();
        // Arrays.sort(nums);
        // int ans = 0;
        // int i = 0, n = nums.length;
        // while (i < n) {
        //     if (set.contains(rev(nums[i]))) {
        //         if (rev(rev(nums[i])) != nums[i]) {
        //             ans++;
        //         }
        //     } else if (isSyc(nums[i])) {
        //         ans++;
        //         set.add(nums[i]);
        //     } else {
        //         ans += 2;
        //         set.add(nums[i]);
        //     }
        //     while (i + 1 < n && nums[i] == nums[i+1]) {
        //         i++;
        //     }
        //     i++;
        // }
        Set<Integer> set = new HashSet<>();
        for (int num : nums) {
            set.add(num);
            set.add(rev(num));
        }
        // Collections.sort(list);
        // int n = list.size(), times = 0; 
        // for (int i = 1; i < n; i++) {
        //     if (list.get(i-1) == list.get(i)) {
        //         times++;
        //     }
        // }
        return set.size();
    }
    
    public boolean isSyc(int num) {
        StringBuffer sb = new StringBuffer(""+num);
        return sb.toString().equals(sb.reverse().toString());
    }
    
    public int rev(int num) {
        // int newnum = 0;
        // while (num > 0) {
        //     newnum = newnum * 10 + num % 10;
        //     num /= 10;
        // }
        // return newnum;
        StringBuffer sb = new StringBuffer(""+num);
        return Integer.parseInt(sb.reverse().toString());
    }
}

6219. 反转之后的数字和

暴力解法

class Solution {
    public boolean sumOfNumberAndReverse(int num) {
        if (num == 0) {
            return true;
        }
        int n = 0;
        int tmp = num;
        while (tmp > 0) {
            n++;
            tmp /= 10;
        }
        int start = 1;
        for (int i = 1; i < n; i++) {
            start *= 10;
        }
        int j = Math.min(start,start/2);
        while (j <= num) {
            if (j+rev(j) == num) {
                return true;
            }
            j++;
        }
        return false;
    }
    
    public int rev(int num) {
        StringBuffer sb = new StringBuffer(""+num);
        return Integer.parseInt(sb.reverse().toString());
    }
}

6207. 统计定界子数组的数目

以不在minK,maxK范围内的数值为分割点,计算每一个符合条件的子数组的右端点的子数组个数,然后累加。
符不符合条件就看minK,maxK的下标是否在分割点的右侧
容斥原理的解题思路把,看有题解这样说(还不懂容斥原理)

class Solution {
    public long countSubarrays(int[] nums, int minK, int maxK) {
        int maxi = -1, mini = -1, idx = -1;
        long ans = 0;
        for (int i = 0;i < nums.length; i++) {
            if (nums[i] == minK) {
                mini = i;
            }
            if (nums[i] == maxK) {
                maxi = i;
            }
            if (nums[i] < minK || nums[i] > maxK) {
                idx = i;
            }
            ans += Math.max(0,Math.min(mini,maxi) - idx);
        }
        return ans;
    }
}

你可能感兴趣的:(leetcode,算法,java)