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));

【LeetCode】738. 单调递增的数字的更多相关文章

  1. Java实现 LeetCode 738 单调递增的数字(暴力)

    738. 单调递增的数字 给定一个非负整数 N,找出小于或等于 N 的最大的整数,同时这个整数需要满足其各个位数上的数字是单调递增. (当且仅当每个相邻位数上的数字 x 和 y 满足 x <= ...

  2. [Swift]LeetCode738. 单调递增的数字 | Monotone Increasing Digits

    Given a non-negative integer N, find the largest number that is less than or equal to Nwith monotone ...

  3. [LeetCode] 738. Monotone Increasing Digits 单调递增数字

    Given a non-negative integer N, find the largest number that is less than or equal to N with monoton ...

  4. [LeetCode] Monotone Increasing Digits 单调递增数字

    Given a non-negative integer N, find the largest number that is less than or equal to N with monoton ...

  5. [LeetCode] 926. Flip String to Monotone Increasing 翻转字符串到单调递增

    A string of '0's and '1's is monotone increasing if it consists of some number of '0's (possibly 0), ...

  6. [LeetCode] Increasing Subsequences 递增子序列

    Given an integer array, your task is to find all the different possible increasing subsequences of t ...

  7. [Swift]LeetCode926. 将字符串翻转到单调递增 | Flip String to Monotone Increasing

    A string of '0's and '1's is monotone increasing if it consists of some number of '0's (possibly 0), ...

  8. nyoj 单调递增子序列(二)

    单调递增子序列(二) 时间限制:1000 ms  |  内存限制:65535 KB 难度:4   描述 给定一整型数列{a1,a2...,an}(0<n<=100000),找出单调递增最长 ...

  9. 领扣(LeetCode)单调数列 个人题解

    如果数组是单调递增或单调递减的,那么它是单调的. 如果对于所有 i <= j,A[i] <= A[j],那么数组 A 是单调递增的. 如果对于所有 i <= j,A[i]> = ...

随机推荐

  1. SpringMVC(1)流程框架总体介绍

    SpringMVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面.Spring 框架提供了构建 Web 应用程序的全功能MVC 模块,其功能和Strtus2 ...

  2. pdfkit html转pdf

    pdfkit的通用option选项 参考:https://cloud.tencent.com/developer/ask/202116https://www.cnblogs.com/taceywong ...

  3. runtime使用总结

    runtime这个东西,项目是很少用到的,但面试又避不可少,了解其内部的机制对底层的理解还是很有必要的. 1.动态添加属性 拓展类别属性的简单实现 a.定义字面量指针 static char dyna ...

  4. 解决ionic5多个模态关闭一个其他不显示的问题

    ionic5 modal使用过程中,在模态窗中打开另外一个模态窗,浏览器中显示正常,但是andorid8系统真机调试时,关闭最上层模态窗,上级模态窗DOM中存在,但是不显示. 原因是android版本 ...

  5. String、StringBuilder和StringBuffer的比较

    目录 1.String特性 1.1 不可变 1.2 字符串常量池 2.StringBuilder和StringBuffer 2.1 区别 2.2 应用场景 1.String特性 1.1 不可变 它是I ...

  6. Linux | 配置主机名称

    配置主机名称 为了便于在局域 网中查找某台特定的主机,或者对主机进行区分,除了要有 IP 地址外,还要为主机配置一个主机名,主机之间可以通过这个类似于域名的名称来相互访问. 在 Linux 系统中,主 ...

  7. kong配置service和route实现简单API代理

    目录 通过konga连接kong实现API接口代理 1. ADD NEW SERVICE 2. ADD ROUTE 3. 验证API 代理 浏览器验证 请求kong api kong使用Admin A ...

  8. Hadoop知识总结

    ------------恢复内容开始------------ Hadoop知识点 Hadoop知识点什么是HadoopHadoop和Spark差异Hadoop常见版本,有哪些特点,一般是如何进行选择H ...

  9. [TJOI2007]书架 题解

    文中给了你一些句子,以及让你任意插入某个位置以及查询某个位置的句子. 发现因为是句子很难搞,所以开个 map 离散一下成数字.然后在额外开一个 map 记录这个数字对应的句子. 然后你要写一种支持插入 ...

  10. VisualEffectGraph基础操作 --创建VEG项目步骤讲解

    一:建立VEG项目步骤 首先打开Unity Hub,  使用unity2020.1 新建项目(本技术博客,默认使用unity2020.1 版本演示),选择HDRP 高清渲染管线,确定项目目录与名称. ...