给定一个数字字符串S和一个数组nums,数组中的元素都在0~9之间,问从数组中选择元素组成的数字,小于N的最大值是多少?
例如:S = "24378",nums:{2,3,9},组成的最大值为23999。
代码:
import java.util.Arrays;
public class Solution {
public static void main(String[] args) {
int[] nums = new int[]{2, 3, 9};
Solution solution = new Solution();
System.out.println(solution.getMaxLessNum(nums, 22199));
System.out.println(solution.getMaxLessNum(nums, 2222));
System.out.println(solution.getMaxLessNum(nums, 2322));
System.out.println(solution.getMaxLessNum(nums, 223));
System.out.println(solution.getMaxLessNum(nums, 99));
System.out.println(solution.getMaxLessNum(nums, 323));
System.out.println(solution.getMaxLessNum(nums, 322));
System.out.println(solution.getMaxLessNum(nums, 12));
System.out.println(solution.getMaxLessNum(nums, 14));
System.out.println(solution.getMaxLessNum(nums, 23));
}
public int getMaxLessNum(int[] nums, int N) {
Arrays.sort(nums);
int[] arr = new int[String.valueOf(N).length()];
int a = N - 1;
for (int i = arr.length - 1; i >= 0; --i) {
arr[i] = a % 10;
a /= 10;
}
boolean flag = false;
for (int i = 0; i < arr.length; ++i) {
if (flag) {
arr[i] = nums[nums.length - 1];
} else if (arr[i] < nums[0]) {
for (int j = i; j >= 0; j--) {
if (arr[j] > nums[0]) {
arr[j] = findNum(nums, arr[j] - 1);
break;
}
if (j == 0) {
arr[j] = 0;
} else {
arr[j] = nums[nums.length - 1];
}
}
flag = true;
} else {
int num = findNum(nums, arr[i]);
if (num < arr[i]) {
flag = true;
}
arr[i] = num;
}
}
int ans = 0;
for (int j : arr) {
ans = ans * 10 + j;
}
return ans;
}
private int findNum(int[] nums, int num) {
int l = 0, r = nums.length - 1;
while (l <= r) {
int mid = (l + r) / 2;
if (nums[mid] == num) {
return nums[mid];
} else if (nums[mid] > num) {
r = mid - 1;
} else {
l = mid + 1;
}
}
return nums[r];
}
}