版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}
运行结果: