落单的数1

题目描述:某一个数组里面只有一个数K出现了一次,其余的都出现了2次,找出这个数。

public static void main(String[] args) {
		int[] a=new int[]{1,1,2,2,3,3,4,4,5,5,6,7,7,8,8,9,9,0,0};
		int x=0;
		for(int i=0;i<a.length;i++){
			x=x^a[i];
		}
		System.out.println(x);
	}
	
	//解析:所有出现偶数次的数据  都会在连续的异或之后消掉,只剩下出现奇数次的数据

落单的数2

题目描述:一个数组,只有一个数单独出现,其余的数字都出现k次 如:222 444 777 8 000 333。 此时 k=3

public static void main(String[] args) {
		int k=3;
		int[] a=new int[]{2,2,2,4,4,4,7,7,7,8,0,0,0,3,3,3};
		int len=a.length;
		char[][] ch=new char[len][];
		int maxLen=0;
		//将每一个数字转换成k进制字符数组
		for(int i=0;i<a.length;i++){
			//求每一个数字的k进制字符串并翻转    :122--》221为了不进位加法时低位能够对齐
			ch[i]=new StringBuilder(Integer.toString(a[i],k)).reverse().toString().toCharArray();
			if(ch[i].length>maxLen){
				maxLen=ch[i].length;  //获取最大的字符串长度
			}
		}


		int[] 	resArr=new int[maxLen];
		for (int i = 0; i <len ; i++) {
			//不进位加法
			for (int j = 0; j <maxLen ; j++) {
				if(j>=ch[i].length){
					resArr[j]+=0; //不够的位数补0
				}else {
					resArr[j]+=(ch[i][j]-'0');
				}
			}
		}

		int res=0;
		//还原成10进制
		for (int i = 0; i <maxLen ; i++) {
			res+=(resArr[i]%k)*(int)Math.pow(k,i);
		}
		System.out.println(res);
	}

//解析:2个2进制的数做不进位加法:结果为0
	//10个10进制的数做不进位加:结果为0
	//k个k禁止的数做不进位加法,结果为0
	// 解题思路  :将所有的数转换成k进制,然后进行不进位的加法,最后剩余的那个数就是单独的那个数,在转成10进制
	//Java中的进制转换:Integer.toString(i,radix);args1:要转的数据  args2:要转的进制