通过递归函数进行打印
/*
* 打印1到最大的n位数
* */
*
public class Solution_17 {
//通过字符数组来实现打印 n 位数
public static void Print1ToMaxOfNDigits(int n) {
if (n < 0) {
return;
}
StringBuffer s = new StringBuffer(n);//新建一个字符串
for (int i = 0; i < n; i++) {//将字符串的每一个位置都置为 0
s.append('0');
}
//通过全排列将字符串中的每一个设置成为 0~9 的字符 利用的方法是递归
for (int i = 0; i < 10; i++) {
s.setCharAt(0, (char) (i+'0'));
Print1ToMaxOfNDigitsRecursely(s,n,0);
}
}
//辅助函数,帮助上面的函数将字符串的每一位进行 0~9 的全排列
public static void Print1ToMaxOfNDigitsRecursely(StringBuffer s, int n, int index) {
if (index == n - 1) {//位数满足 n 则打印字符串
PrintNumber(s);
return;
}
//递归位数不满足 n 位,则继续进行递归
for (int i = 0; i < 10; i++) {
s.setCharAt(index+1, (char) (i+'0'));
Print1ToMaxOfNDigitsRecursely(s, n,index+1);//继续递归下一位
}
}
//打印字符串
// 打印的细节:从第一个不为 0 的数字开始打印,前面的 0 都不打印
public static void PrintNumber(StringBuffer s) {
boolean isBeginning = false;//是否打印的标志位
for (int i = 0; i < s.length(); i++) {//遍历整个字符串的每一位
if (!isBeginning && s.charAt(i) != '0') {//寻找第一个不为0的那一位,然后将是否打印的标志位置为 true
isBeginning = true;
}
if (isBeginning) {//开始打印字符串
System.out.print(s.charAt(i));
}
}
System.out.print(" , ");//每打印完一个字符串就进行一个分割
}
//测试主函数
public static void main(String[] args) {
Solution_17.Print1ToMaxOfNDigits(2);
}
}