给定一个包含n个整数的数组,除了一个数出现一次以外,其他数均出现两次,找出这个出现一次的整数
思路:运用异或运算,暴力,快速……
public class SingleNumber { public static int singleNumber(int[] A) { int x = 0 ; for(int a:A) x = x ^ a ; return x ; } public static void main(String[] args) { int A[] = {1,1,4,4,2,3,3} ; int s = singleNumber(A) ; System.out.printf("%d ",s) ; } }
异或运算法则:
1^1 = 0
1^0 = 1
0^1 = 1
0^0 = 0
另外一种方法:
public class SingleNumberII { public static int Solve(int A[]) { int sum = 0 ; for(int i = 0 ; i < 32 ; i++) { // 统计每一位“1”的个数 int count = 0 , d = 1 << i ; for(int a:A) count += (a >> i) & 1 ; // 取出最低位 if(count % 2 > 0) // 去除出现两次的整数 sum |= d ; } return sum ; } public static void main(String[] args) { int[] A = {1,1,2,2,3,3,5} ; int x = Solve(A) ; System.out.printf("%d ",x) ; } }
给定一个包含n个整数的数组,除了一个数据没有出现三次,其他数据都出现三次,找出这个整数
public class SingleNumberII { public static int Solve(int A[]) { int sum = 0 ; for(int i = 0 ; i < 32 ; i++) { // 统计每一位“1”的个数 int count = 0 , d = 1 << i ; for(int a:A) count += (a >> i) & 1 ; if(count % 3 > 0) // 去除出现三次的整数 sum |= d ; } return sum ; } public static void main(String[] args) { int[] A = {1,1,1,2,2,2,3,3,3,5} ; int x = Solve(A) ; System.out.printf("%d ",x) ; } }