欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-03-16 20:12:04
...

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

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

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);
		
		
	}
}
相关标签: 算法--位运算