import java.util.Arrays;
public class Main {
public int get(int target, int[] nums , int mode ){
// (10个数,用不着二分)
// nums数组升序
// 找到小于等于target的最大值/
// mode=0 找到小于target的最大值
// mode=1 找到小于等于target的最大值
int ans = -1;
for(int i=0;i<nums.length;i++){
if(mode == 0){
if(nums[i] < target){
ans = nums[i];
}else{
break;
}
}else{
if(nums[i] <= target){
ans = nums[i];
}else{
break;
}
}
}
return ans;
}
public int back(int index,String s,int[] nums,StringBuffer stringBuffer){
while(index>=0&&get(s.charAt(index) - '0',nums,0) == -1){
index -- ;
}
if(index<0){
//说明找不到,那只能位数减1,全部取最大值
StringBuffer t = new StringBuffer();
// 如果最大位数-1后为0,那么没有结果,返回-1;
if(s.length()-1 == 0){
return -1;
}
for(int n=0;n<s.length()-1;n++){
t.append(nums[nums.length-1]);
}
return Integer.valueOf(t.toString());
}else{
// 把对应位置的数字置为 小于target对应位置数字
int tmp2 = get(s.charAt(index) - '0',nums,0);
stringBuffer.setCharAt(index,(char)(tmp2+'0'));
// 先清除原来位置的数字
for(int i = stringBuffer.length()-1;i>index;i--){
stringBuffer.deleteCharAt(i);
}
//之后的位置全部取最大值
for(int n= index+1;n<s.length();n++){
stringBuffer.append(nums[nums.length-1]);
}
return Integer.valueOf(stringBuffer.toString());
}
}
public int solution(int[] nums,int target){
Arrays.sort(nums);
String s = String.valueOf(target);
StringBuffer stringBuffer = new StringBuffer();
//stringBuffer.setCharAt(0,(char)0);
for(int i=0;i<s.length();i++){
int tmp = get(s.charAt(i) - '0',nums,1);
if(tmp != -1){
stringBuffer.append(tmp);
if(tmp < s.charAt(i) - '0'){
// 之后的位置全部选择最大值
for(int n = i+1;n<s.length();n++){
stringBuffer.append(nums[nums.length-1]);
}
return Integer.valueOf(stringBuffer.toString());
}
}else{
// 没有找到那就回退
// 回退到能找到小于对应位置数字的下标
int index = i-1;
return back(index,s,nums,stringBuffer);
}
}
if(Integer.valueOf(stringBuffer.toString()) == target){
return back(s.length()-1,s,nums,stringBuffer);
}
return Integer.valueOf(stringBuffer.toString());
}
public static void main(String[] args) {
int[] nums = new int[]{2,4,9,0};
System.out.println(new Main().solution(nums,23121));
}
}
【无标题】
于 2022-07-29 23:58:08 首次发布