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