输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。
序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。
解题思路:
- 首先通过一次遍历,获取所有元素的异或值;
- 计算异或值中的一个值是1的位,这个位就是答案中两个数字的不同之处;
- 利用这个位,在于求部分元素的异或值,哪部分的元素呢?就是分别是这个位为1和0的两个部分,这样就把问题转化为求只出现一次的数字了。
- 看代码吧。
class Solution {
public int[] singleNumbers(int[] nums) {
int temp = 0;
int[] res = new int[2];
for(int n : nums) {
temp ^= n;
}
int k = 0;
while(((temp >> k) & 1) == 0) k++;
int temp2 = 0;
for(int n : nums) {
if(((n >> k) & 1) == 1) temp2 ^= n;
}
temp = 0;
for(int n : nums) {
if(((n >> k) & 1) == 0) temp ^= n;
}
res[0] = temp;
res[1] = temp2;
return res;
}
}