题目描述:
一个数组中只有一个数出现了1次,其他的数都出现了K次,请输出出现了1次的那个数。
原理: K个相同的K进制数之间做不进位的加法,结果为0,如,2个2得0 ,10个5得0 .......
解题思路:
将所有的数转化成为K进制,然后做K进制的不进位加法运算,得出的结果再有K进制转换位10进制。
解题步骤:
第一步: 创建一个二维数组,用来保存K进制数。
第二步:转换承K进制数组。
第三步:进行不进位的加法运算,结果得出再resArray数组中。
第四步:对resArray数组遍历,进行10进制转换运算。
第五步:输出结果。
扫描二维码关注公众号,回复:
11260779 查看本文章
关键代码:
public class 出现K次与出现1次 { public static void main(String[] args) { int arr[] = {2,2,2,9,7,7,7,3,3,3,6,6,6,0,0,0}; //第一步:创建一个二维字符数组,用来保存K进制位数 int len = arr.length; char ch [][] =new char[len][]; //第二步:转换成K进制数组 int k =3; int maxlen=0; for(int i=0;i<len;i++){ //先求出每个数字K进制字符串,反转(低位对其运算)并转换为字符数组 ch[i] = new StringBuilder(Integer.toString(arr[i],k)).reverse().toString().toCharArray(); //更新K进制数的最大位数 if (ch[i].length>maxlen) { maxlen = ch[i].length; } } //第三步:进行不进位加法运算,结果得出再resArray中 int resArray[] = new int [maxlen]; for (int i = 0; i < len; i++) { for (int j = 0; j < maxlen; j++) { if(j<ch[i].length){ resArray[j]+=(ch[i][j]-'0'); }else { resArray[j]+=0; } } } //第四步:对resArray数组遍历,进行10进制转换运算 int res=0; for(int i=0;i<resArray.length;i++){ res+=(resArray[i]%k)*(int)(Math.pow(k,i)); } //第五步:输出结果 System.out.println(res); } }