给定0-9一些数字,每个数字多次使用。给个一个n,求用给定数字组成的小于n的最大值。nums={2,4,9},n=23121,ans=22999
public int biggerNumber(int[] nums,int n){
String str=String.valueOf(n);
Arrays.sort(nums);
StringBuilder sb=new StringBuilder();
n=str.length();
int m=nums.length;
for(int i=0;i<n;i++){
char ch=str.charAt(i);
int num=ch-'0';
int res=Arrays.binarySearch(nums,num);
if(res>=0){
sb.append(ch);
}else if(res==-1){//没有比当前位更小的数字了
int j=back(sb,i-1,nums,str);
if(j==-1){
if(n==1){
return -1;
}
char[] chars=new char[n-1];
Arrays.fill(chars,(char)('0'+nums[m-1]));
return Integer.parseInt(new String(chars));
}
int tmp=Arrays.binarySearch(nums,str.charAt(j));
sb.append((char)(nums[tmp-1]+'0'));
for(int k=j+1;k<n;k++){
sb.append((char)('0'+nums[m-1]));
}
return Integer.parseInt(sb.toString());
}else{
sb.append((char)('0'+nums[-res-1-1]));
for(int j=i+1;j<n;j++){
sb.append((char)(nums[m-1]+'0'));
}
return Integer.parseInt(sb.toString());
}
}
int j=back(sb,n-1,nums,str);
if(j==-1){
if(n==1){
return -1;
}
char[] chars=new char[n-1];
Arrays.fill(chars,(char)('0'+nums[m-1]));
return Integer.parseInt(new String(chars));
}
int tmp=Arrays.binarySearch(nums,str.charAt(j));
sb.append((char)(nums[tmp-1]+'0'));
for(int k=j+1;k<n;k++){
sb.append((char)('0'+nums[m-1]));
}
return Integer.parseInt(sb.toString());
}
private int back(StringBuilder sb,int index,int[] nums,String str){
char ch='0';
int j=index;
for(;j>=0;j--){
ch=str.charAt(j);
if(ch-'0'!=nums[0]){
return j;
}
sb.deleteCharAt(j);
}
return -1;
}