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);
}
}
推荐阅读
-
java实现 一个数组中只有一个数仅出现了一次,剩下的都出现了K次,求只出现了一次的那个数
-
一个数组中只有两个数字是出现一次, 其他所有数字都出现了两次。 找出这两个数字,编程实现。
-
一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。找出这两个数字,编程实现
-
一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。找出这两个数字,编程实现
-
一个数组中只有两个数字是出现一次, 其他所有数字都出现了两次。 找出这两个数字,编程实现。
-
一个数组中只有两个数字是出现一次, 其他所有数字都出现了两次。 找出这两个数字,编程实现。
-
c语言 一个数组中只有两个数字是出现一次, 其他所有数字都出现了两次。 找出这两个数字,编程实现。
-
【c语言】一个数组中只有两个数字是出现一次, 其他所有数字都出现了两次。 找出这两个数字,编程实现。
-
C语言:一个数组中只有两个数字是出现一次, 其他所有数字都出现了两次。 找出这两个数字,编程实现。
-
一个数组中只有两个数字是出现一次, 其他所有数字都出现了两次。 找出这两个数字,编程实现。