class Solution {
public int missingInteger(int[] nums) {
int sum = nums[0];
for (int i = 1; i < nums.length && nums[i] == nums[i - 1] + 1; i++) {
sum += nums[i];
}
Set<Integer> set = new HashSet<>();
for (int num : nums) {
set.add(num);
}
while (set.contains(sum)) {
sum++;
}
return sum;
}
}
给你一个下标从 0 开始的整数数组 nums
和一个正整数 k
。
你可以对数组执行以下操作 任意次 :
- 选择数组里的 任意 一个元素,并将它的 二进制 表示 翻转 一个数位,翻转数位表示将
0
变成1
或者将1
变成0
。
你的目标是让数组里 所有 元素的按位异或和得到 k
,请你返回达成这一目标的 最少 操作次数。
注意,你也可以将一个数的前导 0 翻转。比方说,数字 (101)2
翻转第四个数位,得到 (1101)2
。
示例 1:
输入:nums = [2,1,3,4], k = 1 输出:2 解释:我们可以执行以下操作: - 选择下标为 2 的元素,也就是 3 == (011)2 ,我们翻转第一个数位得到 (010)2 == 2 。数组变为 [2,1,2,4] 。 - 选择下标为 0 的元素,也就是 2 == (010)2 ,我们翻转第三个数位得到 (110)2 == 6 。数组变为 [6,1,2,4] 。 最终数组的所有元素异或和为 (6 XOR 1 XOR 2 XOR 4) == 1 == k 。 无法用少于 2 次操作得到异或和等于 k 。
nums xor k结果1的个数
class Solution {
public int minOperations(int[] nums, int k) {
for (int x : nums) {
k ^= x;
}
return Integer.bitCount(k);
}
}
给你两个正整数 x
和 y
。
一次操作中,你可以执行以下四种操作之一:
- 如果
x
是11
的倍数,将x
除以11
。 - 如果
x
是5
的倍数,将x
除以5
。 - 将
x
减1
。 - 将
x
加1
。
请你返回让 x
和 y
相等的 最少 操作次数。
示例 1:
输入:x = 26, y = 1 输出:3 解释:我们可以通过以下操作将 26 变为 1 : 1. 将 x 减 1 2. 将 x 除以 5 3. 将 x 除以 5 将 26 变为 1 最少需要 3 次操作。
记忆化搜索
class Solution {
private final Map<Integer, Integer> memo = new HashMap<>();
public int minimumOperationsToMakeEqual(int x, int y) {
if (x <= y) {
return y - x;
}
if (memo.containsKey(x)) {
return memo.get(x);
}
int ans = x - y;
ans = Math.min(ans, minimumOperationsToMakeEqual(x / 11, y) + x % 11 + 1);
ans = Math.min(ans, minimumOperationsToMakeEqual(x / 11 + 1, y) + 11 - x % 11 + 1);
ans = Math.min(ans, minimumOperationsToMakeEqual(x / 5, y) + x % 5 + 1);
ans = Math.min(ans, minimumOperationsToMakeEqual(x / 5 + 1, y) + 5 - x % 5 + 1);
memo.put(x, ans);
return ans;
}
}