给定一个数字字符串S和一个数组nums,数组中的元素都在0~9之间,问从数组中选择元素组成的数字,小于N的最大值是多少?
例如:S = "24378",nums:{2,3,9},组成的最大值为23999。
先给出代码:
public class Code01 {
public static void main(String[] args) {
int[] nums = new int[]{2,3,9};
int N = 24399;
System.out.println(getMaxBelowN(nums,N));
System.out.println(getMaxLessNum(nums,N));
}
public static String getMaxLessNum(int[] nums,int N){
Arrays.sort(nums);
String maxBelow = getMaxBelowN(nums,N);
StringBuilder sb = new StringBuilder();
boolean flag = false;
for(int i = 0; i < maxBelow.length(); i++){
/*
每位都找小于等于该位最大的数,如果maxBelow这个位置的数大于等于nums的最大值,就用最大值
否则去数组找最接近的
如果当前从数组中找的数字小于maxBelow对应这位的数字,此后选择的数字都可以是数组中的最大值
例如2513和{2,4,6,8}
选到第二位4之后,4比5小,此后就可以都选择8,组成2488
*/
char c = maxBelow.charAt(i);
if(flag){
sb.append(nums[nums.length - 1]);
}else{
//拿到应该选择数字的下标
int index = getIndex(nums,maxBelow,i);
sb.append(nums[index]);
//如果选择的数字比当前这位小,此后就都选最大值
if(nums[index] < c - '0') flag = true;
}
}
return sb.toString();
}