【每日刷题】单调递增的数字

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sd4567855/article/details/86523044

day21, 单调递增的数字

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

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

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

示例 3:
输入: N = 332
输出: 299

说明: N 是在 [0, 10^9] 范围内的一个整数。

解答:方法一:枚举法,一个一个枚举。。提交上去超时。
方法二:把每一位存到一个数组中,从最高位依次检查,如果某一位比前一位高,则该位置上自减1(注意当该位上为0的处理方式),并比它低的位置上全部化为9.

代码:

int digit( int N){
        int digit = 0;
        while( N)
            digit++, N/=10;
        return digit;
    }
    
    int monotoneIncreasingDigits(int N) {
        if( N < 10)
            return N;

        int k = N;
        int bit = digit( k);
        vector<int> record;
        for( int j = 0; j < bit; j++)
            record.push_back( k%10) , k/=10;
        
        //调整为正常顺序
        for( int j = 0; j < record.size() / 2; j++)
            swap( record[j], record[ record.size() - j - 1]);
        
        while( 1){
            int i = 1;
            for( ; i < record.size(); i++)
                if( record[i - 1] > record[i])
                    break;
            
            if( i == record.size()){
                int result = 0;
                for( int j =  0; j < record.size(); j++)
                    result = 10 * result + record[j];
                    
                return result;
            }
            else{
                int CF = 0;
                for( int j = i+1; j < record.size(); j++)
                    record[j] = 9;
                for( int j = i; j >= 0; j--){
                    if( j == i){
                        record[ j] = record[j] - 1;
                        if( record[j] == -1)
                            record[j] = 9, CF = 1;
                    }
                    else{
                        record[ j] = record[j] - CF;
                        if( record[j] == -1)
                            record[j] = 9, CF = 1;
                        else
                            CF = 0;
                    }
                    if( j == 0 && record[j] == 0)
                        record.erase( record.begin());
                }    
            }
                
        }
       
        return 0;
    }

运行结果:image.png-25.8kB


我的微信公众号

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/sd4567855/article/details/86523044