给一个数字n,比如是22123,有一个数字数组,求由数字数组组成的最大的小于n的数字, 比如数字数组为{1, 2, 9},结果就是22122
解法
import java.util.*;
public class MaxNumberLessThanNSimple {
public static long findMaxNumberLessThanN(long n, int[] digits) {
if (digits == null || digits.length == 0) return -1;
Arrays.sort(digits);
String nStr = String.valueOf(n);
// 生成所有可能的候选数字,找最大的小于n的
String result = generateMaxNumber(nStr, digits);
return result != null ? Long.parseLong(result) : -1;
}
private static String generateMaxNumber(String nStr, int[] digits) {
int len = nStr.length();
// 尝试相同长度
String sameLength = findMaxSameLength(nStr, digits, 0, "");
if (sameLength != null) return sameLength;
// 尝试长度-1
if (len > 1) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < len - 1; i++) {
sb.append(digits[digits.length - 1]);
}
return sb.toString();
}
return null;
}
private static String findMaxSameLength(String target, int[] digits, int pos, String current) {
if (pos == target.length()) {
return current.compareTo(target) < 0 ? current : null;
}
int targetDigit = target.charAt(pos) - '0';
// 从大到小尝试数字
for (int i = digits.length - 1; i >= 0; i--) {
int digit = digits[i];
String newCurrent = current + digit;
if (digit < targetDigit) {
// 找到小于的数字,后面用最大数字填充
StringBuilder sb = new StringBuilder(newCurrent);
for (int j = pos + 1; j < target.length(); j++) {
sb.append(digits[digits.length - 1]);
}
return sb.toString();
} else if (digit == targetDigit) {
// 相等,继续递归
String result = findMaxSameLength(target, digits, pos + 1, newCurrent);
if (result != null) return result;
}
}
return null;
}
public static void main(String[] args) {
System.out.println(findMaxNumberLessThanN(22123, new int[]{1, 2, 9})); // 21999
System.out.println(findMaxNumberLessThanN(2111, new int[]{1, 2, 9})); // 1999
System.out.println(findMaxNumberLessThanN(3000, new int[]{1, 2, 9})); // 2999
}
}