【我也想刷穿 LeetCode啊】386. 字典序排数

53 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第2天,点击查看活动详情

现在前端很多岗位面试需要有一定的算法基础,或者说经常刷算法的会优先考虑。

因此每天刷刷LeetCode非常有必要

在这之前我也刷过一些算法题,也希望以后也坚持刷,跟某掘友一样,我也想刷穿 LeetCode

一、题目描述

给你一个整数 n ,按字典序返回范围 [1, n] 内所有整数。

你必须设计一个时间复杂度为 O(n) 且使用 O(1) 额外空间的算法。

 

示例 1:

输入:n = 13 输出:[1,10,11,12,13,2,3,4,5,6,7,8,9]

示例 2:

输入:n = 2 输出:[1,2]  

提示:

1 <= n <= 5 * 104

来源:力扣(LeetCode) 链接:leetcode.cn/problems/le… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、思路分析

由于dfs是O(n)的空间复杂度,所以改为迭代的方式,如果只是常规迭代那就也需要O(n)的空间复杂度,在这里可以发现,迭代时,下一次迭代的状态可通过 去 除以10取整直到尾数不为9(为9的话加一就会导致进位,例如,119,那下一个叫就会变成120,那么就需要让num再除以10取整,也就是从11开始再继续后面的+1的流程) 例如 当n = 120;

第一次外循环中:① 那么在内层中先进入第一个循环依次加入 num,,分别为 1,10,100,最后num变成1000,

② 进入第二个循环,然后num变成100,

③ num++变成101;

第二次外循环中: ①num变成1010

②num变成101

③num变成102

在后续几次循环中,num一直变成109,

此时在内层的第二个while就会让num变成10,接下来,就会从10++,num变成11开始下一轮外循环

那么往返几次后就会顺序拿到所有的数字

三、代码实现

/**
 * @param {number} n
 * @return {number[]}
 */
var lexicalOrder = function (n) {
    let num = 1;
    const res = [];
    while (res.length < n) {
        while (num <= n) {
            res.push(num);
            num *= 10;
        }
        while (num % 10 === 9 || num > n) {
            num = Math.floor(num / 10)
        }
        num++;
    }
    // console.log('res', res)
    return res;
};

四、总结

以上就是本道题的所有内容了,本系列会持续更,欢迎点赞、关注、收藏,另外如有其他的问题,欢迎下方留言给我,我会第一时间回复你,感谢~