ok
看题:
题意很简单,也就是要找一个保证自己在形式上是升序,且最大不超过给出的值的一个数,这里用到的方法是贪心,主要是,先以给出的数为基础,如果满足条件,这就是最大的那个数,如果不是升序,再通过减一进行调整,但是每次调整都保证是当时的最大情况。
代码:
class Solution {
public:
int monotoneIncreasingDigits(int N) {
//转换为string类型,方便利用下标获得值
string ts = to_string(N) ;
int size = ts.size();
//从左开始找,找到第一个不满足升序条件的下标
int index = 0;
while( index < size-1 && ts[index]-'0' <= ts[index+1]-'0' )
{
index++;
}
if( index == size-1 ) return N;//如果没有找到,那么整个字符串自己是满足要求的
ts[index] = ts[index] - '0' -1 + '0' ;// 这里就是将下标退回到不满足升序条件的上一位,然后减1
for( int i = index+1 ;i < size ;++i)//如果要保证这个数字合理的进行,就要让后面的数字变大
{
ts[i] = '9' ;
}
//判断改变后的字符串是否满足升序
for( int i = index;i > 0;--i )
{
if( ts[i] - '0' < ts[i-1] - '0')//在i处不是升序了
{
ts[i] = '9' ;//当前下标的数提到最大
ts[i-1] = ts[i-1] - '0' -1 +'0' ;//前一位数减1
}
else
{
continue;
}
}
return stoi(ts);
}
};
ok