题目
整数数组 sockets 记录了一个袜子礼盒的颜色分布情况,其中 sockets[i] 表示该袜子的颜色编号。礼盒中除了一款撞色搭配的袜子,每种颜色的袜子均有两只。请设计一个程序,在时间复杂度 O(n),空间复杂度O(1) 内找到这双撞色搭配袜子的两个颜色编号。
示例 1:
输入:sockets = [4, 5, 2, 4, 6, 6]
输出:[2,5] 或 [5,2]
示例 2:
输入:sockets = [1, 2, 4, 1, 4, 3, 12, 3]
输出:[2,12] 或 [12,2]
提示:
2 <= sockets.length <= 10000
代码
class Solution {
public int[] sockCollocation(int[] nums) {
int z = 0;
for(int i = 0;i < nums.length; i++){
z = z ^ nums[i];
}
int m = 1;while((m & z) == 0){m = m << 1;}int x = 0, y = 0;for(int i = 0;i < nums.length; i++){if((nums[i] & m) == 0){//结果为 0 的子数组,一边统计用异或统计xx = x ^ nums[i];} else {//结果为 1 的子数组,一边统计用异或统计yy = y ^ nums[i];}}return new int[]{x, y};
}
}