字节一面笔试题:小于n的最大数

指定降序数组arr和数字n,输出数组能组成的小于等于数字n的最大值。比如arr=[9,4,3,2],n=433211,输出432999;

思路,贪心+二分。

难的在于中途有数字找不到比它小的数的话,得回退,需要确认回退逻辑怎么写。

Java代码如下:

public int maxNum(){

List<Integer> arr = Arrays.asList(9,4,3,2);

int n = 433211;

List<Integer> nlist = new ArrayList<>();

int base = 0;

while(n!=0){

nlist.add(0,n%10);

n /= 10;

base = base*10+1;

}

boolean less = false;

int res = 0;

for(int i=0;i<nlist.size();i++){

if(less){

res = res*10+arr.get(0);

continue;

}

int index = find(arr,nlist.get(i));

if(index==-1){

int l = i;

while(l>=0&&index==-1){

index = find(arr,nlist.get(l)-1);

l-=1;

}

if(index==-1){

res = base*arr.get(0)/10;

break;

}

res = res/((int) Math.pow(10,i-l-1));

res = res*10 + nlist.get(index);

for(int p=0;p<i-l-1;p++){

res = res*10+arr.get(0);

}

less = true;

}else if(arr.get(index)==nlist.get(i)){

res = res*10+arr.get(index);

}else{

res = res*10+arr.get(index);

less = true;

}

}

return res;

}

public int find(List<Integer> arr,int k){

if(k<arr.get(arr.size()-1)) return -1;

int index = -1;

int l = 0,r = arr.size()-1;

while(l<=r){

int mid = (l+r)/2;

if(arr.get(mid)==k){

return mid;

}else if(arr.get(mid)<k){

index = mid;

r = mid -1;

}else{

l = mid + 1;

}

}

return index;

}

#字节##面试##笔试##手撕代码#
全部评论

相关推荐

点赞 3 评论
分享
牛客网
牛客企业服务