G
N
I
D
A
O
L

题目链接:https://leetcode.cn/contest/weekly-contest-337/

# 奇偶位数

# 代码

a
class Solution {
    public int[] evenOddBit(int n) {
        int k = 0, e = 0, o = 0;
        while (n > 0) {
            int t = n % 2;
            if(n % 2 == 1) {
                if ((k & 1) == 1) ++o;
                else ++e;
            }
            n /= 2;
            ++k;
        }
        return new int[] {e , o};
    }
}

# 检查骑士巡视方案

# 解题思路

0 ~ n*n - 1 这个 n*n 对坐标存入长度为 n*n 的数组,然后依次从 0 开始遍历该数组,同时记录上一个位置的下标,满足条件则继续,不满足则直接返回 false

# 提交结果

image.png

# 代码

class Solution {
    public boolean checkValidGrid(int[][] grid) {
        int n = grid.length;
        if (grid[0][0] != 0) return false;
        int[][] arr = new int[n * n][2];
        
        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < n; j++) {
                arr[grid[i][j]][0] = i; 
                arr[grid[i][j]][1] = j; 
            }
        }
        
        int x = 0, y = 0;
        for (int i = 1; i < n * n; ++i) {
            int nx = arr[i][0];
            int ny = arr[i][1];
            
            if ((Math.abs(nx - x) == 2 && Math.abs(ny - y) == 1) 
                    || (Math.abs(ny - y) == 2 && Math.abs(nx - x) == 1)) {
                x = nx;
                y = ny;
            } else {
                return false;
            }
        }
        return true;
    }
}

# 执行操作后的最大 MEX

# 解题思路

  • 统计 nums 中所有的数对 value 取余后的分布情况,使用 hashmap 存储余数的个数
  • 从 0 到 n 枚举缺少的最小非负整数,同时更新 hash 表即可

需要注意的是 java 中负数取余操作:
比如 -3 % 4 = -3,但是题目意思应该 - 3 可以变为 1,
因此对于负数,应该是: nums[i] % value + value ,而对于非负整数取余就是 nums[i] % value
综上,本题取余操作应该是: (nums[i] % value + value) % value

# 提交结果

image.png

# 代码

a
class Solution {
    public int findSmallestInteger(int[] nums, int value) {
        int n = nums.length;
        Map<Integer, Integer> cnt = new HashMap<>();
        for (int num : nums) {
            int mod = (num % value + value) % value;
            cnt.put(mod, cnt.getOrDefault(mod, 0) + 1);
        }
        int ret = 0;
        for (int i = 0; i < n; ++i) {
            int mod = ret % value;
            int c = cnt.getOrDefault(mod, 0);
            // 没法获得当前的 ret,
            if (c < 1) break;
            
            cnt.put(mod, c - 1);
            // 继续下一个数枚举
            ++ret;
        }
        
        return ret;
    }
}
更新于 阅读次数

😉觉得写的还不错,请我喝杯咖啡吧😁

独步凌波 微信支付

微信支付

独步凌波 支付宝

支付宝