博客
关于我
738 单调递增的数字(找出逆序的位置)
阅读量:355 次
发布时间:2019-03-04

本文共 1817 字,大约阅读时间需要 6 分钟。

1. 问题描述:

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

示例 1:

输入: N = 10
输出: 9

示例 2:

输入: N = 1234
输出: 1234

示例 3:

输入: N = 332
输出: 299

说明: N 是在 [0, 10^9] 范围内的一个整数。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/monotone-increasing-digits

2. 思路分析:

① 首先想到的是从N这个数字往前找,依次检查N之前的数字是否满足单调递增的条件,假如满足那么返回这个数字即可,但是提交上去后面比较大的数字超时了

②  第二个比较容易想到的是找出数字后面开始逆序的位置,这个时候需要将前面的数字减去1,看一下是否满足条件,比如1276,逆序的位置为3,所以将前面的7这个数字减去1得到6而这个时候减去1之后是满足单调递增所以这个方法大体上是可行的,但是也会遇到这样的情况,比如数字12333332,这个时候我们只是减去了一个1的话那么结果就是错误的,因为有可能前面的数字减去1之后导致不是单调递增了,所以这个时候需要使用循环继续比较当前位置的数字与前面一个数字的大小关系,依次减去1直到所有的位置都是单调递增的,最后根据记录的逆序的位置index计算出结果,[0:index]这些位置的数字是顺序的,直接计算出结果即可,后面[index:len(nums)]的位置都是9,将两部分的结果结合起来就是要求解的答案了

3. 代码如下:

class Solution:    def solve(self, N: int):        nums = list()        while N > 0:            # 使用insert函数往列表开始位置添加元素            nums.insert(0, N % 10)            N //= 10        return nums    def monotoneIncreasingDigits(self, N):        nums = self.solve(N)        # 逆序遍历        index = len(nums)        for i in range(len(nums) - 1, 0, -1):            if nums[i] < nums[i - 1]:                nums[i - 1] -= 1                index = i        res = 0        for i in range(0, index):            res = res * 10 + nums[i]        for i in range(index, len(nums)):            res = res * 10 + 9        return res

超时代码:

class Solution:    def solve(self, num):        # 使用循环从后往前判断每一位数字的大小情况        pre = 10 ** 9        while num > 0:            if num % 10 > pre: return False            pre = num % 10            # 每一次都除以10这样可以取出每一位上的数字是多少            num //= 10        return True    def monotoneIncreasingDigits(self, N: int) -> int:        # 其实这道题目可以使用从N往前找判断每一位数字是否递增的即可, 主要是模拟整个过程        while N >= 0:            if self.solve(N): return N            N -= 1        return -1

 

转载地址:http://ulgr.baihongyu.com/

你可能感兴趣的文章
linux 的 pwd 命令
查看>>
linux 的 sleep 命令
查看>>
js 的 let var const 区别
查看>>
无线掌上B超USONIX-R6线阵B模图像初步
查看>>
无线掌上B超USONIX-R6凸阵B模图像初步
查看>>
react路由使用以及封装
查看>>
vue计算属性和监听器区别
查看>>
前端常用知识随手记
查看>>
使用 FileUpload 实现文件上传
查看>>
11.2.6 时间值的小数秒
查看>>
11.2.7 日期和时间类型之间的转换
查看>>
附录 B 错误信息和常见问题
查看>>
redis 内存溢出_从数据存储的角度告诉你Redis为什么这么快!
查看>>
实例分析Facebook激励视频广告接入
查看>>
实例:使用OKGO下载网络压缩包资源,然后解压缩放在本地使用
查看>>
Android主题和样式精炼详解
查看>>
HDFS Missing Block诊断信息的改进
查看>>
解决mybatis嵌套查询使用PageHelper分页不准确
查看>>
Redis源码分析(七)--- zipmap压缩图
查看>>
大规模集群自动化部署工具--Chef的安装部署
查看>>