题7:出现K次与出现1次

题目描述:

  一个数组中只有一个数出现了1次,其他的数都出现了K次,请输出出现了1次的那个数。

原理: K个相同的K进制数之间做不进位的加法,结果为0,如,2个2得0 ,10个5得0  .......

解题思路:

  将所有的数转化成为K进制,然后做K进制的不进位加法运算,得出的结果再有K进制转换位10进制。

解题步骤:

    第一步: 创建一个二维数组,用来保存K进制数。

    第二步:转换承K进制数组。

    第三步:进行不进位的加法运算,结果得出再resArray数组中。

    第四步:对resArray数组遍历,进行10进制转换运算。

    第五步:输出结果。  

关键代码:

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);
    }
}

猜你喜欢

转载自www.cnblogs.com/songchengyu/p/12951980.html
今日推荐