LeetCode刷题实战440:字典序的第K小数字
2023-03-15 23:22:41 时间
算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !
今天和大家聊的问题叫做 字典序的第K小数字,我们先来看题面:
https://leetcode-cn.com/problems/k-th-smallest-in-lexicographical-order/
Given two integers n and k, return the kth lexicographically smallest integer in the range [1, n].
示例
输入:
n: 13 k: 2
输出:
10
解释:
字典序的排列是 [1, 10, 11, 12, 13, 2, 3, 4, 5, 6, 7, 8, 9],所以第二小的数字是 10。
解题
https://zhuanlan.zhihu.com/p/113194071
十叉树,用题目的测试用例来举例子。
我们求字典序第k个就是上图前序遍历访问的第k节点!但是不需要用前序遍历,如果我们能通过数学方法求出节点1和节点2之间需要走几步,减少很多没必要的移动。
其实只需要按层节点个数计算即可,图中节点1和节点2在第二层,因为n = 13,节点1可以移动到节点2(同一层)所以在第二层需要移动1步。
第三层,移动个数就是 (13 - 10 + 1) = 4 (min(13 + 1, 20) - 10)
所以节点1到节点2需要移动 1 + 4 = 5 步
当移动步数小于等于k
,说明需要向右节点移动,图中就是节点1移动到节点2。
当移动步数大于k
,说明目标值在节点1和节点2之间,我们要向下移动!即从节点1移动到节点10。
class Solution:
def findKthNumber(self, n: int, k: int) -> int:
def cal_steps(n, n1, n2):
step = 0
while n1 <= n:
step += min(n2, n + 1) - n1
n1 *= 10
n2 *= 10
return step
cur = 1
k -= 1
while k > 0:
steps = cal_steps(n, cur, cur + 1)
if steps <= k:
k -= steps
cur += 1
else:
k -= 1
cur *= 10
return cur
好了,今天的文章就到这里,如果觉得有所收获,请顺手点个在看或者转发吧,你们的支持是我最大的动力 。
相关文章
- 升级版短信:“5G消息”将于年内上线
- 最新macOS破坏SSH默认规则,程序员无法登录Web服务器
- 新基建中如何保证软件质量?云测试成热门服务
- 支付宝城市服务正式升级为市民中心:功能更多
- 苹果iOS 14系统面板截图曝光:加入全新墙纸设置,或加入主屏小部件
- 2019年手机浏览器市场份额排行榜,极简的夸克未上榜
- 如何成功实现移动设备管理
- 外观回归经典,苦等已久的iPhone 9,4月发布!
- 工信部回应“中国手机用户暴减”:两方面原因所致
- 全球手机家电供应链突遭印度“劫”
- 云计算软件公司如何在不影响质量的情况下降低成本
- 不止变蓝还有新变化 支付宝的这些“新功能”你用了吗?
- iOS新代码显示苹果可能推出iPhone 9 Plus
- 【横评】12款在线会议软件哪家易上手?
- 企业微信的掣肘与野望
- 美国进入紧急状态:谷歌1700名工程师抗疫,马斯克称车祸更危险
- 如何清洁你的 iPhone 和 AirPods ?苹果的官方教程来了
- 避免远程办公翻车,钉钉、企业微信和飞书谁更适合你
- 终于!iPhone能用安卓系统了
- 疫情期间,这家土生土长的农商行做了这些事