一起养成写作习惯!这是我参与「掘金日新计划 · 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;
}
};
思路:(来源官方题解)
- 依据题意 最小是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的一个过程
希望对您有一点点帮助,如有错误欢迎小伙伴指正