出现k次与出现1次《算法很美》

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

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

具体思路:

  1. 创建一个字符二维数组char[][] kRadix = new char[len][];
  2. 将arr[]的每一个数转换成三进制Integer.toString(arr[i],k),并进行翻转-变为字符串-最后整成字符数组
  3. 同时要将最长的三进制数长度存储 if (kRadix[i].length > maxlen) maxlen = kRadix[i].length;
  4. 开辟一个新数组存放进制的不进位每一位的和 int[] resArr = new int[maxlen];
  5. 把全部数的三进制的每一位做不进位和放入数组resArr[maxlen]中
  6. 最后再用for遍历resArr[maxlen]%k * (int) (Math.pow(k, i),其实就是%k之后,如果3个相同的基本为0,只有相同数不为三的%k不为0,那么得出的就是只出现一次的数。

例子:

10进制:
297360
3进制:
210021100
反转(如果不进行反转就不能正确的位数进行相加)
200112010
位数相加(3个相同的,要3个相加)
991
每位%3*对应位数k次方(1*3^2)9

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};
        int len = arr.length;
        char[][] kRadix = new char[len][];
        int k = 3;

        int maxlen = 0;
        //转成k进制字符数组
        //对于每个数字
        for (int i = 0; i < len; i++){
            //求每一个数字的三进制字符串并翻转,然后转为字符数组
            kRadix[i] = new StringBuilder(Integer.toString(arr[i],k)).reverse().toString().toCharArray();

            if (kRadix[i].length > maxlen)
                maxlen = kRadix[i].length;
        }
        //不进位加法
        int[] resArr = new int[maxlen];
        for(int i = 0; i < len; i++){
            // 不进位加法
            for(int j = 0; j < maxlen; j++){
                if(j >= kRadix[i].length)
                    resArr[j] += 0;
                else
                    resArr[j] += (kRadix[i][j] - '0');
            }
        }

        int res = 0;
        for (int i = 0; i < maxlen; i++){
            res += (resArr[i] % k) * (int) (Math.pow(k, i));
        }
        System.out.println(res);

    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值