【LeetCode】738. 单调递增的数字

738. 单调递增的数字

知识点:字符串;贪心

题目描述

给定一个非负整数 N,找出小于或等于 N 的最大的整数,同时这个整数需要满足其各个位数上的数字是单调递增。

(当且仅当每个相邻位数上的数字 x 和 y 满足 x <= y 时,我们称这个整数是单调递增的。)

示例
输入: N = 10 输出: 9 输入: N = 1234 输出: 1234 输入: N = 332 输出: 299

解法一:贪心

想一下这个过程,如果比前一位大的话那就可以不用动直接返回;如果比前一位小的话例如98,应该怎么做呢,我们取小于等于8的都没用,因为都比前一位要小,不满足递增,所以只能让前一位变小一位了,9变成8,那我们最后一位自然要取到9,高位数和这个二位数一个道理,只要有比前一位小的了,那自然要把前一位-1,后面所有位变为9;

但是还有一点要注意,比如332,我们找到2小了,那把前一位减1了,但是减完之后自己又比更前一位的小了,所有更前一位也得减1;只要自己前面减1了,那自己就不用管了,赋成9就行,所以还要找到减完之后仍然满足递增的那个位置;

所以这道题是在找两个位置

  • 往后找:第一个比前一位小的位置;
  • 往前找:往前开始-1后第一个仍然满足递增的位置;
class Solution { public int monotoneIncreasingDigits(int n) { char[] str = Integer.toString(n).toCharArray(); //转换成字符数组方便操作,注意这个方法; int i = 1; while(i < str.length && str[i] >= str[i-1]){ i++; //往后找:找到第一个比前一位小的元素; } if(i < str.length){ while(i > 0 && str[i] < str[i-1]){ str[i-1]--; //往前找:前一位-1后可能又比更前一位小了,所以循环往前找到满足递增的; i--; } for(i += 1; i < str.length; i++){ str[i] = '9'; //后面全是9就可以了; } } return Integer.parseInt(new String(str)); //字符数组转成字符串,再转成数组; } }

体会

要学会整形转字符串,转字符数组:Integer.toString(n).toCharArray();
要学会字符数组转字符串,转整形:Integer.parseInt(new String(str));


__EOF__

本文作者Curryxin
本文链接https://www.cnblogs.com/Curryxin/p/15132729.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   Curryxin  阅读(136)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
Live2D
欢迎阅读『【LeetCode】738. 单调递增的数字』
点击右上角即可分享
微信分享提示