2022-02-05:字典序的第K小数字。
给定整数 n 和 k,找到 1 到 n 中字典序第 k 小的数字。
注意:1 ≤ k ≤ n ≤ 10**9。
示例 :
输入:
n: 13 k: 2
输出:
10
解释:
字典序的排列是 [1, 10, 11, 12, 13, 2, 3, 4, 5, 6, 7, 8, 9],所以第二小的数字是 10。
力扣440。

答案2022-02-05:

这道题很难想到。具体见代码。
划分成左,中,右三部分。
时间复杂度:O(logN)。这道题在leetcode上,所有题解都只能做到O( (logN) 平方)的解。

代码用golang编写。代码如下:

package main

import "fmt"

func main() {
n := 13
k := 2
ret := findKthNumber(n, k)
fmt.Println(ret)
} var offset = []int{0, 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000}
var number = []int{0, 1, 11, 111, 1111, 11111, 111111, 1111111, 11111111, 111111111, 1111111111} func findKthNumber(n, k int) int {
// 数字num,有几位,len位
// 65237, 5位,len = 5
len0 := lenf(n)
// 65237, 开头数字,6,first
first := n / offset[len0]
// 65237,左边有几个?
left := (first - 1) * number[len0]
pick := 0
already := 0
if k <= left {
// k / a 向上取整-> (k + a - 1) / a
pick = (k + number[len0] - 1) / number[len0]
already = (pick - 1) * number[len0]
return kth((pick+1)*offset[len0]-1, len0, k-already)
}
mid := number[len0-1] + (n % offset[len0]) + 1
if k-left <= mid {
return kth(n, len0, k-left)
}
k -= left + mid
len0--
pick = (k+number[len0]-1)/number[len0] + first
already = (pick - first - 1) * number[len0]
return kth((pick+1)*offset[len0]-1, len0, k-already)
} func lenf(n int) int {
len0 := 0
for n != 0 {
n /= 10
len0++
}
return len0
} func kth(max int, len0 int, kth0 int) int {
// 中间范围还管不管的着!
// 有任何一步,中间位置没命中,左或者右命中了,那以后就都管不着了!
// 但是开始时,肯定是管的着的!
closeToMax := true
ans := max / offset[len0]
for dinc(kth0) > 0 {
kth0--
max %= offset[len0]
len0--
pick := 0
if !closeToMax {
pick = (kth0 - 1) / number[len0]
ans = ans*10 + pick
kth0 -= pick * number[len0]
} else {
first := max / offset[len0]
left := first * number[len0]
if kth0 <= left {
closeToMax = false
pick = (kth0 - 1) / number[len0]
ans = ans*10 + pick
kth0 -= pick * number[len0]
continue
}
kth0 -= left
mid := number[len0-1] + (max % offset[len0]) + 1
if kth0 <= mid {
ans = ans*10 + first
continue
}
closeToMax = false
kth0 -= mid
len0--
pick = (kth0+number[len0]-1)/number[len0] + first
ans = ans*10 + pick
kth0 -= (pick - first - 1) * number[len0]
}
}
return ans
}

执行结果如下:


左神java代码

2022-02-05:字典序的第K小数字。 给定整数 n 和 k,找到 1 到 n 中字典序第 k 小的数字。 注意:1 ≤ k ≤ n ≤ 10**9。 示例 : 输入: n: 13 k: 2的更多相关文章

  1. 2022.02.05 DAY2

    前言 今天陪老姐送对象去安庆了,上午还去了西风禅寺求了个签,第一次拿到中评签,看来今年还需要继续努力哈哈哈.一直到晚上才有时间去做点题目,今天依旧是leetcode. 题目 leetcode 1 两数 ...

  2. 【LeetCode】1415. 长度为 n 的开心字符串中字典序第 k 小的字符串 The k-th Lexicographical String of All Happy Strings of Le

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 回溯法 日期 题目地址:https://leetcod ...

  3. [补题]找到原序列长度k的子序列中字典序最小的那个(单调栈)

    题意 题目如题,输入序列只包含小写字母,数据范围0<k<=len<=500000. 例: 输入:helloworld 输出:ellld 题解 使用单调栈.当已删掉n-k个字符,输出栈 ...

  4. 2022.02.21 SA

    2022.02.21 SA 当我年少轻狂时,我曾拥有自由,但我并不明白它的意义.我曾拥有时间,但我没有意识到它的珍贵.我曾拥有爱,但我从未用心去体会.数十年的时间考验后,我终于理解了三者的真谛. 我已 ...

  5. 2022.02.20 SA

    2022.02.20 SA 如果我还能看见明天黎明,如果我还能再爬起来,我仍会走我的路,哪怕这条路已经荒废许久,也许我们无法拥有感情,我们甚至无法像个正常人一样接受太阳的洗礼,但是我依然会执行我的条约 ...

  6. [Swift]LeetCode1015. 可被 K 整除的最小整数 | Smallest Integer Divisible by K

    Given a positive integer K, you need find the smallest positive integer N such that N is divisible b ...

  7. Leetcode 1022. 可被 K 整除的最小整数

    1022. 可被 K 整除的最小整数  显示英文描述 我的提交返回竞赛   用户通过次数74 用户尝试次数262 通过次数75 提交次数1115 题目难度Medium 给定正整数 K,你需要找出可以被 ...

  8. 现有‘abcdefghijkl’12个字符,将其所有的排列按字典序进行排序,给出任意一组排列,说出这租排列在所有排列中是第几小的

    题目: 现有‘abcdefghijkl’12个字符,将其所有的排列按字典序进行排序,给出任意一组排列,说出这租排列在所有排列中是第几小的 据说这道题是百度校招的一道算法题,反正我觉得我在学校的时候很可 ...

  9. 给定整数a1、a2、a3、...、an,判断是否可以从中选出若干个数,使得它们的和等于k(k任意给定,且满足-10^8 <= k <= 10^8)。

    给定整数a1.a2.a3.....an,判断是否可以从中选出若干个数,使得它们的和等于k(k任意给定,且满足-10^8 <= k <= 10^8). 分析:此题相对于本节"寻找满 ...

  10. ROS的安装-> rosdep init /update报错2022.02.24实测有效

    ROS的安装-> rosdep init /update报错2022.02.24实测有效   一. 解决rosdep_init问题 正常执行sudo rosdep init会报错,如下: ERR ...

随机推荐

  1. Arduino优化 减少重复代码 例2

    Example->Blink: void setup() { pinMode(LED_BUILTIN, OUTPUT); } void loop() { digitalWrite(LED_BUI ...

  2. OSPF之路由撤销1

  3. .net core mvc中session的应用

    1.首先新建一个空的web项目,在Program.cs中打开和使用session public class Program { public static void Main(string[] arg ...

  4. 如何使用Github创建一个仓库

    创建仓库(对我来说,这是新建) 点击这里的Create repository: 进入到这样一个界面: 其中,Repository name,是我们即将创建完成的仓库名称: 而这里: 需要填写的是对仓库 ...

  5. 文件的上传&预览&下载学习(三)

    0.参考博客 https://www.pianshen.com/article/18961690151/ (逻辑流程图讲得很清楚) https://www.cnblogs.com/xiahj/p/vu ...

  6. Python实战项目-10文件存储/支付宝支付/支付成功回调接口

    文件存储 视频文件存储在某个位置,如果放在自己服务器上 放在项目的media文件夹 服务器上线后,用户既要访问接口,又需要看视频,都是使用一个域名和端口 分开:问价你单独放在文件服务器上,文件服务器带 ...

  7. 手把手 Golang 实现静态图像与视频流人脸识别

    说起人脸识别,大家首先想到的实现方式应该是 Python 去做相关的处理,因为相关的机器学习框架,库都已经封装得比较好了.但是我们今天讨论的实现方式换成 Golang,利用 Golang 去做静态图像 ...

  8. 关于 manacher 的一个小细节

    在该算法中,我们需要用到一个数组 hw[i] ,代表 i 的最大回文半径.而且这个半径不包括 i 本身(若串为 ccc 则 hw 为 1). 这时最终答案为最大的 hw 减一. 为什么要减一呢?最终的 ...

  9. java数组排序及查找方法

    前言 在上一篇文章中,壹哥给大家讲解了数组的扩容.缩容及拷贝方式.接下来在今天的文章中,会给大家讲解更重要的数组排序及查找方法.今天的内容会有点难,希望你不要因此而退缩,挺过这一关,你会向上突破的! ...

  10. 从零开始学习Java系列之Java运行机制与跨平台特性

    全文大约[4000]字,不说废话,只讲可以让你学到技术.明白原理的纯干货!并带有丰富的案例及配图,让你更好地理解和运用文中的技术概念,给你带来具有足够启迪的思考-- 在上一篇文章中,壹哥给大家介绍了J ...