题目链接: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
。
# 提交结果
# 代码
| 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
# 提交结果
# 代码
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); |
| |
| |
| if (c < 1) break; |
| |
| cnt.put(mod, c - 1); |
| |
| ++ret; |
| } |
| |
| return ret; |
| } |
| } |