题目链接:https://leetcode.cn/contest/weekly-contest-337/
# 奇偶位数
# 代码
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 。
# 提交结果

# 代码
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
# 提交结果

# 代码
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; | |
} | |
} |