码迷,mamicode.com
首页 > 其他好文 > 详细

LintCode 743. 单调递增的数字

时间:2018-04-12 23:29:25      阅读:272      评论:0      收藏:0      [点我收藏+]

标签:amp   就会   param   inf   less   mon   最大   返回   pre   

给一非负整数 N, 找到小于等于 N 的最大的 单调递增数. (回想一下, 当且仅当每对相邻的数字 x 和 y 满足 x <= y 时, 这个整数才是单调递增数)

 注意事项

N 为范围 [0, 10^9] 内的整数

样例

给出 N = 10, 返回 9
给出 N = 12345, 返回 12345
给出 N = 10000, 返回 9999

思路:从后往前找到最后上升的两个数,然后将这两个数里面前面一个数-1,后面的数全部改成9就行了,这个处理string比较好操作一点,所以这里我经过了int和string的转变处理,直接int上操作要用%10然后多一些细节,需要注意的是这样的两个数找到之后需要继续往前搜索是否存在相同的数,找到最前面的数然后减一,否则就会出错,可以考虑范例中的111111110。
 
 1 class Solution {
 2 public:
 3     /**
 4      * @param num: a non-negative integer N
 5      * @return: the largest number that is less than or equal to N with monotone increasing digits.
 6      */
 7     int monotoneDigits(int num) {
 8         // write your code here
 9         string s = to_string(num);
10         char before = 9;
11         int index = s.size()-1;
12         for(int i = s.size()-1; i>=0; --i){//从后往前找到增加最后一对上升数对
13             if(s[i]>before) index = i;
14             before = s[i];
15         }
16         if(index == s.size()-1) return num;//index没变表示全部升序排列,返回原数
17         while(index>0 && s[index-1] == s[index]) index--;//关键一步,否则会出错,注意越界
18         s[index]--;
19         for(int j = index+1; j<s.size(); ++j) s[j]=9;//后面的数全部转变为9
20         return stoi(s);//用stoi省去了头部可能的去0操作
21     }
22 };

 

LintCode 743. 单调递增的数字

标签:amp   就会   param   inf   less   mon   最大   返回   pre   

原文地址:https://www.cnblogs.com/J1ac/p/8810899.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!