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. 图的存储与遍历C++实现

    1.图的存储 设点数为n,边数为m 1.1.二维数组 方法:使用一个二维数组 adj 来存边,其中 adj[u][v] 为 1 表示存在 u到 v的边,为 0 表示不存在.如果是带边权的图,可以在 a ...

  2. ORA-12560: 解决TNS:协议适配器错误

    1)安装成功,但无法连接数据库 2)网上查找原因:32位的不能运行64位的oracle,而且不会有64位的版本 3)解决办法:大致是修改客户端数据库为32位的(此方法OK) (1)解压instantc ...

  3. LAMP——实现phpMyadmin、wordpress及Discuz应用部署

    一.环境准备 操作系统:Centos8.3.2011 软件:Apache2.4.37.Mysql8.0.21.PHP7.2.24 二.安装过程 1.安装phpmyadmin 1.1.安装软件包并启动服 ...

  4. MyBatis框架的使用解析!数据库相关API的基本介绍

    动态SQL if 根据条件包含where子句的一部分 <select id="findActiveBlogLike" resultType="Blog"& ...

  5. springcloud gateway(hystrix filter)

    参考 https://blog.csdn.net/forezp/article/details/83792388 1.依赖pom.xml <project xmlns="http:// ...

  6. php混淆加密解密实战

    在查看别人的php源码的时候,我们经常会看到加密后的php代码.那么php加密原理是什么呢?怎么解密呢? 混淆加密 我们从百度随便搜索一个加密网站,例如:http://dezend.qiling.or ...

  7. 使用Azure Congnitive Services 技术制作AI故事机

    引言 前一段时间有幸参加了微软MVP的AI方面的学习挑战赛,对于AI 这个新的领域的技术瞬间勾起了我的学习兴趣. 最近几年,不管是国内还是国外,AI都是一个异常火热的词.比如现在的自动驾驶技术,其实就 ...

  8. ESP32智能配网笔记

    基于ESP-IDF4.1 #include <string.h> #include <stdlib.h> #include "freertos/FreeRTOS.h& ...

  9. 以太网MAC地址组成与交换机基本知识

    以太网MAC地址 MAC地址由48位二进制组成,通常分为六段,用十六进制表示,工作在数据链路层. 数据链路层功能: 链路的建立,维护与拆除 帧包装,帧传输,帧同步 帧的差错恢复 简单的流量控制 第八位 ...

  10. Java异常情况

    从网上了解了这些Java异常,遇到过一些,大部分还没遇到: 1. SQLException:操作数据库异常类. 2. ClassCastException:数据类型转换异常. 3. NumberFor ...