剑指OFFER笔记_17_打印从1到最大的n位数_JAVA实现
题目:打印从1到最大的n位数
- 输入数字n,按顺序打印出从1到最大的n位十进制数。比如输入3,则打印出1、2、3一直到最大的三位数999。
解题思路
- 此题力扣的要求很低,因为规定了函数的返回类型是int[],所以注定不会实现n过大导致int类型无法存储的情况,所以我选择了加大难度。
- 当n较大的时候,我们用int无法存储了,即使是用long long 也会有越界的情况。我选择采用字符数组来存储。
- 若输入n为3,则可以理解为有三个数位,每个数位都从0~9遍历一遍就可以输出所有的情况了。其中需要排除000的情况,此外还有一种情况就是前几位为0,如004,056这种情况,输出的时候不需要输出字符数组前面的‘0’,稍加处理即可。
代码
函数主体部分代码
package q17;
/**
* 输入数字n,按顺序打印出从1到最大的n位十进制数。
*/
public class Solution {
/**
* 输出从1到最大的n位数
* @param n
*/
public void printNumbers(int n) {
if(n <= 0)
{
System.out.println("ERROR");
return;
}
char[] chars = new char[n];
//存储n和当前的下标
int length = n;
int index = 0;
for (int i = 0; i < 10; i++) {
//改变chars的第0位
chars[0] = (char)('0'+ i );
//递归处理
printRecursively(chars, index, length);
}
}
public void printRecursively(char[] chars, int index, int length)
{
//全部置位后,可以输出
if (index == length-1)
{
print(chars);
return;
}
//否则,往后一位置位,然后继续递归
for (int i = 0; i < 10; i++) {
chars[index+1] = (char)('0' + i);
printRecursively(chars, index+1, length);
}
}
public void print(char[] chars)
{
//异常处理
if (chars == null)
{
return;
}
int index = 0;
while(chars[index] == '0')
{
//若全为0,直接返回不输出。
if (index == chars.length-1)
{
return;
}
index++;
}
//从第一个非0开始输出。
for (int i = index; i < chars.length; i++) {
System.out.print(chars[i]);
}
System.out.println();
}
}
测试部分代码
package q17;
public class TestApp {
public static void main(String[] args) {
Solution s = new Solution();
s.printNumbers(0);
s.printNumbers(3);
}
}
运行结果截图