题目描述
数组中只有一个数出现了1次,其他数都出现了k次,请找出只出现了一次的那个数并输出。
解题方法
方法一
用哈希表,把每一个数字当作键,扫描数组,数字每出现一次,键对应的值+1,最后输出哈希表中值为1的键。
方法二
用不进位加法,不进位加法的特点是k个相同的k进制的数相加,结果为0。将数组中的数都转化为k进制,然后相加,将结果从k进制转为10进制,即为只出现一次的数。
下面练习用第二个方法解题
代码
public class 出现k次与出现1次 {
public static void main(String[] args) {
int [] arr={1,1,1,4,4,4,8,9,9,9,0,0,0,11,11,11};
int k=3; //出现k次
int len=arr.length;
char [][] arr2=new char[len][];
int maxLen=0;
//将10进制转为k进制,重点是进制转换和字符反转的妙用
for(int i=0;i<len;i++){
arr2[i]=new StringBuilder(Integer.toString(arr[i],k)).reverse().toString().toCharArray();
if(maxLen<arr2[i].length)
maxLen=arr2[i].length;
}
int []arr3=new int[maxLen];
//做不进位加法
for(int i=0;i<len;i++){
for(int j=0;j<maxLen;j++){
if(j>=arr2[i].length)
arr3[j]+=0;
else
arr3[j]+=(arr2[i][j]-'0');
}
}
int result=0;
//将k进制转化为二进制
for(int i=0;i<maxLen;i++){
result+=(arr3[i]%k)*(int)(Math.pow(k,i));
}
System.out.println(result);
}
}
参考资料:蓝桥杯指导课程——《算法很美》