java实现 一个数组中只有一个数仅出现了一次,剩下的都出现了K次,求只出现了一次的那个数

此题我用的是位运算求解,实际上也可以用哈希表,构成键值对求解~ 步骤都在注释里,有问题欢迎留言交流

忽略类名…实在想不到啥英语

public class JinZhiMiaoYong {

	public static void main(String[] args) {
		/**
		 * 思路:
		 * 1)将数组中的每一个数转换为K进制
		 * 2)逐个相加。因为是不进位加法,所以需要取余
		 * 3)剩下的数转换为10进制就是所寻找的数
		 * 此题用哈希表也可做解
		 * 实在不行就暴力解
		 * 
		 * 为什么是K进制?
		 * 因为,K个K进制数做不进位加法的结果为0
		 * 
		 */
		//这里假设K为3
		int k=3;
		int arr[]={3,5,4,9,3,3,5,5,9,9,6,4,4,1,1,1};
		int arLen=arr.length;
		//构造二维字符数组,存每个十进制数的K进制数的每一位
		char bitArr[][]=new char[arLen][];
		//二位字符数组的列数,决定了最后求和几次
		int maxLen=0;
		
		//将每个数字转换为k进制后放进字符数组
		for(int i=0;i<arLen;i++)
		{
			//转换为3进制,翻转,放进字符数组
			//翻转了就可以将低位对齐
			bitArr[i]=new StringBuilder(Integer.toString(arr[i],k)).reverse().toString().toCharArray();
			if(bitArr[i].length>maxLen)
				maxLen=bitArr[i].length;//更新列数
		}
		/*
		 * 对为什么需要翻转的详细解释
		 * 因为每个数转换为三进制数后的长度不一定都是一样的
		 * 如:9的三进制为100,2的三进制为2
		 * 如果直接放进数组,按列求和会出错
		 * 因为低位没有对齐
		 * 只有翻转后,才能将低位对齐
		 * */
		
		//按列不进位求和
		int sumArr[]=new int[maxLen];
		for(int i=0;i<arLen;i++)
		{
			for(int j=0;j<maxLen;j++) {
				if(j>=bitArr[i].length)//出现了某一个数字的三进制长度小于列长
					sumArr[j]+=0;
				else
					sumArr[j]+=(bitArr[i][j]-'0');//将字符转换为数字
			}
		}
		//遍历求和数组,求得最终结果
		int result=0;
		for(int i=0;i<maxLen;i++)
			result+=(sumArr[i]%k)*Math.pow(k, i);
		    //不进位-->取余+转换为十进制
			
		System.out.println("数组"+Arrays.toString(arr)+"中只出现一次的数字是:"+result);
		
		
	}
}
发布了24 篇原创文章 · 获赞 10 · 访问量 1300

猜你喜欢

转载自blog.csdn.net/qq_41625102/article/details/104399377