博客
关于我
单调递增的数字
阅读量:409 次
发布时间:2019-03-06

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

单调递增的数字

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

示例

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

题解

/** * @param {number} N * @return {number} */var monotoneIncreasingDigits = function(N) {    let i = 1;    let num = N;    while(i*10 <= num){        // console.log(i, num);        // 每次取出两位        let n = ~~(num / i) % 100;          i = i * 10;        if(~~(n/10) > n %10) num = ~~(num / i) * i - 1;         // 例如 1332 第一次循环之后是 取整(1332 / 10) * 10 - 1 = 1330 - 1 = 1329        // 第二次循环就是 1300 - 1 = 1299    }    return num;};

思路

整体思路就是将数字当作字符串,从尾到头逆向遍历一遍,每次比较两位,如果后一个位置上的数小于前一个位置上的数,那么就将前边的数减一,并将后边的所有位都变为9,例如当我们遍历到了1323中比较32的这个位置上,此时3 > 2符合条件,那么我们就将3减一并将其后的数都变作9,即将其变为1299,直到遍历到头即可。通常来说可以把数字作为字符串来遍历处理,上面的题解是使用纯数字的方式去做,首先定义i作为标记记录遍历到到的位置,之后定义num作为待处理的数字,定义循环只要能够继续取出两位数就继续循环,这是循环的终止条件,此外能够使用乘法的地方就尽量不要使用除法,在jsint32如果不能够整除则会自动转双精度64,所以在很多地方都需要强制转数值为int32,之后取出两位数,这里~~是使用位运算强制转了整型,在之后将i * 10定义到下一位,如果低一位上的值大于大于高一位上的值,那么就将数值在第i位以后的值都变成0,然后减1即可达到上述的将此位减1以及之后的数字都变为9,可以参考上边的示例,在循环结束后返回处理的数字即可。

每日一题

https://github.com/WindrunnerMax/EveryDay

参考

https://leetcode-cn.com/problems/monotone-increasing-digits/

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

你可能感兴趣的文章
NIS服务器的配置过程
查看>>
NIS认证管理域中的用户
查看>>
Nitrux 3.8 发布!性能全面提升,带来非凡体验
查看>>
NiuShop开源商城系统 SQL注入漏洞复现
查看>>
NI笔试——大数加法
查看>>
NLog 自定义字段 写入 oracle
查看>>
NLog类库使用探索——详解配置
查看>>
NLP 基于kashgari和BERT实现中文命名实体识别(NER)
查看>>
NLP 模型中的偏差和公平性检测
查看>>
Vue3.0 性能提升主要是通过哪几方面体现的?
查看>>
NLP 项目:维基百科文章爬虫和分类【01】 - 语料库阅读器
查看>>
NLP_什么是统计语言模型_条件概率的链式法则_n元统计语言模型_马尔科夫链_数据稀疏(出现了词库中没有的词)_统计语言模型的平滑策略---人工智能工作笔记0035
查看>>
NLP三大特征抽取器:CNN、RNN与Transformer全面解析
查看>>
NLP学习笔记:使用 Python 进行NLTK
查看>>
NLP度量指标BELU真的完美么?
查看>>
NLP的不同研究领域和最新发展的概述
查看>>
NLP的神经网络训练的新模式
查看>>
NLP采用Bert进行简单文本情感分类
查看>>
NLP问答系统:使用 Deepset SQUAD 和 SQuAD v2 度量评估
查看>>
NLP项目:维基百科文章爬虫和分类【02】 - 语料库转换管道
查看>>