找出最接近的字符串

给一个数字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
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容