数组中出现一个数字出现次数的问题
2018-06-14 本文已影响4人
Taoyongpan
一个数组中只有一个数字出现奇数次,其他都是出现偶数次,时间复杂度为O(n);
/**
* Author: Taoyongpan
* Date: Created in 9:35 2018/6/14
* 一个数组中只有一个数只出现了奇数次,其他都是出现偶数次,时间复杂度为O(n)
*/
public class Test10 {
public static void main(String[] args) {
int[] arr = {1,1,2,3,4,2,3,};
int res = arr[0];
for (int i = 1 ; i< arr.length;i++){
res^=arr[i];
}
System.out.println(res);
}
}
一个数字有两个数出现奇数次其他都是出现偶数次
/**
* Author: Taoyongpan
* Date: Created in 9:42 2018/6/14
* 数组中只出现一次的两个数字
* 方法,将 两个不同的数分别放置到两个数组中,
* 通过二进制的某一位,是0或者1将整个数组拆分开
*/
public class Test12 {
public static void main(String[] args) {
int[] arr = {1,1,2,3,4,2,};
int res = 0;
int j = 0;
int num1 = 0;
int num2 = 0;
for (int i = 0 ; i < arr.length ; i++ ){
res^=arr[i];
}
for (j = 0 ;j < 32;j++){
if (((res>>j)&0)==0){
break;
}
}
for (int i = 0;i<arr.length;i++){
if (((arr[i]>>j)&1)==1)
num1^=arr[i];
else
num2^=arr[i];
}
System.out.println(num1);
System.out.println(num2);
}
}
一个数组中只有一个数出现一次,其他都是出现三次,输出这个数:
/**
* Author: Taoyongpan
* Date: Created in 9:38 2018/6/14
* 一个数组中只有一个数字出现了一次 ,其他都是出现了三次,
* 在O(n)的时间复杂度中,求出这个只出现一次的数
* 解法:当一个数组每一个数都出现三次的时候,二进制表示上面每一位 1的个数肯定是三的倍数,
* 当不是三的倍数的时候,说明只出现一次的那个数此位上为1
*/
public class Test11 {
public static void main(String[] args) {
int[] a = {1,1,1,2,2,2,3};
int[] bits = new int[32];
for (int i = 0; i < a.length; i++)
for (int j = 0; j < 32; j++)
bits[j] += ((a[i] >> j) & 1);
int res = 0;
for (int j = 0; j < 32; j++)
if (bits[j] % 3 != 0)
res += (1 << j);
System.out.println(res);
}
}