声明:原题目转载自LeetCode,解答部分为原创
Problem :
Given an integer n, return 1 - n in lexicographical order.
For example, given 13, return: [1,10,11,12,13,2,3,4,5,6,7,8,9].
Please optimize your algorithm to use less time and space. The input size may be as large as 5,000,000.
Solution :
思路:按序输出以 1 为首位、2 为首位 、 3 为首位的各位数。本题的关键是四种数值转换方式,第一种是 原数值 + 1, 第二中 是 1 -> 10 -> 100 -> 1000 -> 10000 <= n, 第三种是 1099 -> 11, 第四种是 (n = 23为例)23 -> 3
代码如下:
#include<iostream>
#include<vector>
using namespace std;
class Solution {
public:
vector<int> lexicalOrder(int n) {
vector<int> out;
int number = 1;
for(int i = 1; i <= n ; i ++)
{
out.push_back(number);
// case_1 :: 1 -> 10 -> 100 -> 1000
if(number * 10 <= n)
{
number *= 10;
continue;
}
//case_2 :: add 100--01, 100-02, 100-03, --- , 100-08, 100-09
if(number % 10 < 9 && number + 1 <= n)
{
number ++;
continue;
}
else
//case_3 :: take ex n = 23 : 23 -> 3 ; n = 1400 : 1099 -> 11
{
while( (number / 10 ) % 10 == 9 )
number /= 10;
number = number / 10 + 1;
}
}
return out;
}
};
int main()
{
Solution text;
vector<int> output = text.lexicalOrder(13);
for(int i = 0 ; i < output.size() ; i ++)
{
cout << output[i] << " ";
}
cout << endl;
return 0;
}