落单的数

落单的数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:要转的进制


全部评论

相关推荐

点赞 评论 收藏
分享
在看数据的傻狍子很忙碌:学生思维好重,而心很急,自己想想真的能直接做有难度的东西吗?任何错误都是需要人担责的,你实习生可以跑路,你的同事领导呢
点赞 评论 收藏
分享
05-09 13:22
门头沟学院 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务