腾讯面试总结

ieg一面问题:(这次是我第一次面试,果然是重在参与了,不过面试官小哥哥基本没问我java相关问题,上来就问会不会c++hhh有点难受)
1个人介绍
2项目相关
3.密码加密机制(盐值+md5),https原理(传证书,传对称密钥),不使用https怎么给后端传加密数据(emmm,这个没想过)
4.redis内存淘汰策略(没看,我的)
5.微服务调用原理(我回答的feign原理)
6.手撕算法……当时我直接蒙了,我思路对了但是大脑直接宕机了……后来面试结束我自己写了一下,写出来了……
问的问题是这个
https://www.nowcoder.com/questionTerminal/cd0a18793cd54302b4ca507ae50a2496
给定N是一个正整数,求比N大的最小“不重复数”,这里的不重复是指没有两个相等的相邻位,如1102中的11是相等的两个相邻位故不是不重复数,而12301是不重复数。
先把这个数拆成数组保存,然后最低位+1
重点是,找到有重复数字的最高位,如果有,重复位+1之后,后面填充01串 (010101……)
例如1120 ,第二位的1和第一位的1重复了,那么第二位的1加1,然后后面填充01串,答案就是1201
以及要考虑最高位可能是9,然后变成10的情况,比如9901,就应该变成10101,所以在这里,我最后处理完遍历的时候,是遍历到length+1位,因为可能ns[length] = 1,而这个1是必要的;
下面是代码

public class test {
    public static int[] carry(int[] nums,int pos,int length){
        for (;pos<length;pos++){
            if (nums[pos]>9){
                nums[pos] = 0;
                nums[pos+1]++;
            }
        }
        return nums;
    }

    public static int maxNoRepeat(int n){
        int length = 0;
        int tmp = n;
        int[] ns = new int[10];
        while(tmp!=0){
            ns[length] = tmp % 10;
            tmp = tmp/10;
            length++;
        }
        ns[0]+=1;
        ns[length] = 0;

        int index = length-1;
        while(index>0){
            if (ns[index]==ns[index-1]){
                ns[index-1]++;
                ns = carry(ns,index-1,length);
                for (int j=index-2;j>=0;j--) {
                    if ((index - j) % 2 == 0) {
                        ns[j] = 0;
                    } else {
                        ns[j] = 1;
                    }
                }
            }else {
                index--;
            }
        }
        int result = 0;
        for (int i = 0;i<length+1;i++){
            result += Math.pow(10,i)*ns[i];
        }

        return result;
    }

    public static void main(String[] args) {
        System.out.println(maxNoRepeat(98));
        System.out.println(maxNoRepeat(1120));
        System.out.println(maxNoRepeat(9991));
        System.out.println(maxNoRepeat(1234));
        System.out.println(maxNoRepeat(13300));
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值