日新计划 · 04-05

119 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第5天,点击查看活动详情

注:仅作为个人学习笔记记录

@TOC

在这里插入图片描述

前言

Hello!小伙伴!

非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出~  

自我介绍 ଘ(੭ˊᵕˋ)੭

昵称:海轰

标签:程序猿|C++选手|学生

简介:因C语言结识编程,随后转入计算机专业,获得过国家奖学金,有幸在竞赛中拿过一些国奖、省奖...已保研。

学习经验:扎实基础 + 多做笔记 + 多敲代码 + 多思考 + 学好英语!   唯有努力💪  

文章仅作为自己的学习笔记 用于知识体系建立以及复习

知其然 知其所以然!

每日一题

386. 字典序排数

给你一个整数 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

思路:

  • 借助vector中的sort方法
  • 现在转化为string类型
  • 再进行排序
  • 最后再反转为int
class Solution {
public:
    vector<int> lexicalOrder(int n) {
        vector<string> arr(n);
        for(int i = 1; i <= n; ++i) {
            arr[i-1] = to_string(i);
        }
        sort(arr.begin(), arr.end());
        vector<int> ans(n);
        for(int i = 0; i < n; ++i) {
            ans[i] = stoi(arr[i]);
        }
        return ans;
    }
};

image.png

思路:(来源官方题解)

  • 依据题意 最小是1
  • 从1开始 是 10 100 1000
  • 发现规律:如果number * 10 < n (number:上一次的数 n:最大的那个数)
  • 那么number * 10 就符合条件,可以添加至上一次已经排序好的数后面
  • 假设目前为 10 且 number * 10 > n (此时number = 10)
  • 说明没有100, 那么10 之后肯定是 10 + 1 = 11
  • 11 之后就是 11 + 1 = 12
  • 12 + 1 = 13
  • ....
  • 当number = 19时, 下一个数理论上是 2
  • 所以当number 最后一位数为 9 时,说明此时最后一位已经遍历完了,之后一个数字,不是190 就是2
  • 若number * 10 < n 那么下一个数字必定是2
  • 因为当前最后一位遍历完全,那么就返回上一位:number /= 10
  • 所以当 number % 10 == 9 (最后一位为9) 或 number + 1 > n (+1h后超过最大值)
  • 就需要进入number的上一位 再次进入循环遍历
class Solution {
public:
    vector<int> lexicalOrder(int n) {
        vector<int> ans(n);
        int number = 1;
        for(int i = 0; i < n; ++i) {
            ans[i] = number;
            if(number * 10 <= n) {
                number *= 10;
            } else {
                while(number % 10 == 9 || number + 1 > n) {
                    number /= 10;
                }
                ++number;
            }
        }
        return ans;
    }
};

结语

文章仅作为个人学习笔记记录,记录从0到1的一个过程

希望对您有一点点帮助,如有错误欢迎小伙伴指正

在这里插入图片描述