欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

leetcode 738.单调递增的数字

程序员文章站 2022-07-12 12:39:11
...

leetcode 738.单调递增的数字

题干

给定一个非负整数 N,找出小于或等于 N 的最大的整数,同时这个整数需要满足其各个位数上的数字是单调递增。
(当且仅当每个相邻位数上的数字 x 和 y 满足 x <= y 时,我们称这个整数是单调递增的。)

示例 1:
输入: N = 10
输出: 9

示例 2:
输入: N = 1234
输出: 1234

示例 3:
输入: N = 332
输出: 299
说明: N 是在 [0, 10^9] 范围内的一个整数。

题解

用最捞的代码,实现最nt的功能
思路就是找到N的递增开头,然后寻找比这个开头小的最大的递增数
然后在得到的递增数后面不断填9,调试地狱。

class Solution {
public:
    int monotoneIncreasingDigits(int N) {
        string s = to_string(N); 
        long long head = s[0] - '0';
        long long pre = N % 10;
        bool nAsAnswerFlag = true;

        for(long long i = 1 ; i < s.size() ; ++i){
            if(s[i] >= s[i-1]){
                head = head * 10 + s[i] - '0';
            }else{
                break;
            }
        }

        if(head == N){
            return N;
        }

        string sHead = to_string(head);
        long long totalHeadDigit = sHead.size();
        long long validHeadDigit = 1;
        for(long long i = totalHeadDigit - 2 ; i >= 0 ; --i){
            if(sHead[i] == sHead[i+1]){
                continue;
            }else{
                validHeadDigit = i + 2;
                break;
            }
        }
        //cout<<head<<endl;
        //cout<<totalHeadDigit<<endl;
        //cout<<validHeadDigit<<endl;
        if(totalHeadDigit - validHeadDigit != 0){
            head = head / pow(10,totalHeadDigit - validHeadDigit);
        }
        //cout<<head;

        head = head / 10 * 10 + head % 10 - 1;

        while(head <= N){
            head = head * 10 + 9;
        }
        head /= 10;

        return head;
    }
};
/*
    如果N是一个各个位递增的数,则直接返回N
    如果N不是,则答案的开头一定比N开头小的最大递增数,这里的开头指的是N开头上升的部分
    所以有步骤:
        1.得到N开头上升部分的数head
        2.取<=head的最大数作为答案res的开头
        3.在res后不断填充9
*/
相关标签: leetcode leetcode