java – Monotone Nondecreasing Digits

给定非负整数N,找到具有单调非递减数字的小于或等于N的最大数字.

(回想一下,当且仅当每对相邻数字x和y满足x <= y时,整数具有单调非递减数字.) 例1:
输入:N = 10
输出:9
例2:
输入:N = 1234
输出:1234
例3:
输入:N = 332
产量:299
注意:N是[0,10 ^ 9]范围内的整数.

嗨,我正在尝试实现上述问题,并且我在超大整数的情况下超出时间限制.你能告诉我如何优化我的解决方案吗?谢谢.

代码:

class Solution {
        public int monotoneNondecreasingDigits(int N) {

            int num = N;
            int quot=0,rem=0;
            List<Integer> res = new ArrayList<>();

            while( num>=0 ){
               if( checkMontone(num) )
                   res.add(num);
               if( res.size() == 2 ) 
                   break;
                num -= 1;
            }

            return Collections.max(res);
        }

        public boolean checkMontone(int num ){

            String s = Integer.toString(num);

            for( int i=1;i<s.length();i++ ){
                if( (int)s.charAt(i-1) > (int)s.charAt(i) )
                    return false;
            }
            return true;
        }

    }

最佳答案 您不应该使用任何列表,因为您可以直接处理您的号码数字.想法是找到大于左边数字Dk-1的第一个数字Dk(如果从左到右).在此之后,Dk-1之后的所有内容都应设置为9以增加数量.但是,它可能不是最大的数字,因为Dk-1可能等于Dk-2,依此类推.这就是为什么找到最左边的数字D1以便Dl = Dk-1并且现在它可以递减并且其后的每个其他数字设置为9的重要性.

private static void printLargestMonoton(String number) {
    char[] chars = number.toCharArray();
    int i = 0;
    // find a position after which the requirement is violated
    while (i < chars.length - 1) {
        if (chars[i] > chars[i + 1]) {
            break;
        }
        i++;
    }

    // if at the end then the number is already the valid one
    if (i == chars.length - 1) {
        System.out.println(String.valueOf(chars));
        return;

    }

    // find the left most position to decrement
    while (i >= 1 && chars[i - 1] == chars[i]) {
        i--;
    }

    // it can happen only for the leftmost digit so mark it to empty it later
    if (chars[i] == '1') {
        // get rid of this char later to avoid a leading zero
        chars[i] = '\0';
    } else {
        chars[i]--;
    }
    // all the digits to the right must be 9
    for (i = i + 1;i < chars.length; i++) {
        chars[i] = '9';
    }

    System.out.println(String.valueOf(chars).replace("\0",""));
}

public static void main(String[] args) {
    String[] numbers = new String[]{"10", "1234", "332", "12214512", "11110"};

    for (String number : numbers) {
        printLargestMonoton(number);
    }
}

产量

9

1234

299

11999999

9999

点赞