您的位置:首页 > 其它

落单的数

2015-11-12 20:13 387 查看

落单的数一

给出2*n + 1 个的数字,除其中一个数字之外其他每个数字均出现两次,找到这个数字。

解题思路:

通过相同的数异或为0 , 与0异或保留, 并且异或的结果与顺序无关

代码实现

/**
*函数功能:找出2n+1个数中的落单的数
*函数描述:通过相互异或来确定落单的数
*/
public static Integer singleNum(int[] arr, int len){
//注意逻辑问题
if(len == 0)
return null;
int ret = arr[0];
for (int i = 1; i < len; i++){
ret ^= arr[i];
}
return ret;
}


落单的数二

给出3*n + 1 个的数字,除其中一个数字之外其他每个数字均出现三次,找到这个数字。

解题思路

用Map来存储key-value , 其中key为数组中的数据, value为其出现的次数,如果出现次数为3次,就可以把它给删除,最后剩下的就是落单的数。

代码实现

public int singleNumberII(int[] A) {
// write your code here
if(A.length == 0){
return 0;
}
HashMap<Integer, Integer> map = new HashMap<>();
for(int i = 0; i < A.length; i++){
if(map.containsKey(A[i])){
map.put(A[i], map.get(A[i]) + 1);
}else {
map.put(A[i], 1);
}
if(map.get(A[i]) == 3){
map.remove(A[i]);
}
}
Set<Integer> result = map.keySet();
int single = 0;
for(Integer temp : result){
single = temp;
}
return single;
}


落单的数三

给出2*n + 2个的数字,除其中两个数字之外其他每个数字均出现两次,找到这两个数字。

解题思路

如果两个不同的数是a和b,先将这个数相互异或得到c, c不等于0, 找出c的二进制位中为1的位,可推断a和b的这位分别为0和1, 然后将2n+2个数,按这位为0或1分成两组,这两组(2k + 1, 2j + 1)分别单独异或, 得到结果

代码实现

public static int[] twoSingleNum(int[] arr){
Integer tempResult = singleNum(arr, arr.length);
if(tempResult != null) {
int c = tempResult;
int d = 1;
int count = 1;
while ((c & d) == 0) {
count++;
d <<= 1;
}
int ret1 = 0;
int ret2 = 0;
for (int num : arr) {
if (bitOne(num, count - 1))
ret1 ^= num;
else
ret2 ^= num;
}
return new int[]{ret1, ret2};

}
return null;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: