17 打印从1到最大的n位数
1 题目描述
输入数字 n
,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。
2 题目分析
第一种解法:直接计算出n位数的最大值,然后依次输出即可。但是面试中往往会让你考虑大数问题,因此就有了第二种解法:采用字符串和全排列来解决。
/*
注意:这里LeeCode给出的返回值是int型数组,因此不存在大数问题,但是一般面试的时候肯定是想让你
考虑大数问题的,故采用字符串全排列来解决,为了符合LeeCode返回值要求,这里强转一下
全排列问题考虑回溯法解决
*/
private static final List<Integer> ans = new ArrayList<>();
public static int[] printNumbers(int n) {
if (n <= 0) return new int[0];
// 定义长度为n的字符数组
char[] numbers = new char[n + 1];
// 回溯起点:列举最高位所有的情况,即'0'~'9'
for (int i = 0; i < 10; i++) {
numbers[0] = (char) (i + '0');
print1ToMaxOfNDigitsRecursively(numbers, n, 0);
}
int size = ans.size();
int[] arr = new int[size];
for (int i = 0; i < size; i++) {
arr[i] = ans.get(i);
}
return arr;
}
private static void print1ToMaxOfNDigitsRecursively(char[] numbers, int length, int index) {
if (index == length - 1) {
// 保存当前结果
// String num = Arrays.toString(numbers);
// 上述代码转换有问题,单独封装一个函数进行转换吧
int cur = transform2Int(numbers);
if (cur > 0 && !ans.contains(cur)) {
ans.add(cur);
return;
}
}
for (int i = 0; i < 10; i++) {
if (index + 1 < length) {
numbers[index + 1] = (char) (i + '0');
print1ToMaxOfNDigitsRecursively(numbers, length, index + 1);
}
}
}
private static int transform2Int(char[] numbers) {
StringBuilder sb = new StringBuilder();
int n = numbers.length;
int p = 0;
while (p < n && numbers[p] == '0') p++;
while (p < n) {
sb.append(numbers[p]);
p++;
}
sb.deleteCharAt(sb.length() - 1);
String s = sb.toString();
int ans;
try {
ans = Integer.parseInt(s);
} catch (NumberFormatException e) {
return 0;
}
return ans;
}