Day3用Java解决出现k次与出现1次

题目描述

数组中只有一个数出现了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);
    }
}

参考资料:蓝桥杯指导课程——《算法很美》

发布了3 篇原创文章 · 获赞 0 · 访问量 1339

猜你喜欢

转载自blog.csdn.net/weixin_44915222/article/details/104078749
今日推荐