参考博客:https://blog.youkuaiyun.com/u013132035/article/details/80563507
/**
* 面试题17:打印从1到最大的n位数
* 题目:输入数字n,按顺序打印出从1到最大的n位十进制数。比如输入3,则打印出1,2,3一直到最大的3位数999.
* @author
* @create 2021-04-20 11:01
*/
public class Solution17 {
public static void main(String[] args) {
// printToMax(4);
printNumSmall(4);
}
/**
* 直观解法,当n较小时,先找到最大的数然后逐个输出
* @param n
*/
public static void printNumSmall(int n){
if (n < 1){
return;
}
int index = 0;
int maxValue = 1;
while (index < n){
index++;
maxValue *= 10;
}
for (int i = 1; i < maxValue; i++) {
System.out.println(i);
}
}
/**
* 方法一:考虑大数问题,用字符串模拟数字加法
* @param n
*/
public static void printNum(int n){
if (n<1){
return;
}
char[] number = new char[n];
for (int i = 0; i < n; i++) {
//每个位置都先初始化为'0'
number[i] = '0';
}
while (!incrementNumber(number)){
//判断是否溢出,若没有溢出就打印该数字
printNumber(number);
}
}
/**
* 字符串模拟加法,返回是否溢出
* @param number
* @return
*/
private static boolean incrementNumber(char[] number){
boolean isOverflow = false;//是否溢出标志位
int nTakeOver = 0;//进位
int nLength = number.length;
for (int i = nLength-1; i >=0; i--) {//从最后一位开始
int nSum = number[i]-'0'+nTakeOver;//当前数字加上进位
if (i == nLength -1){
//如果是最后一位,加1
nSum++;
}
//如果加1后大于等于10
if (nSum >= 10){
//先判断是不是最高位,若最高位进位,则溢出,isOverflow置为true
if (i==0){
isOverflow = true;
}else {
//若最高位没有进位,拆成两位,低位转换成字符
nSum -= 10;
nTakeOver = 1;
number[i] = (char) ('0' + nSum);
}
}else {
//若加1后没有大于10,直接转换为字符
number[i] = (char)(nSum + '0');
break;
}
}
return isOverflow;
}
/**
* 方法二:全排列
* @param n
*/
public static void printToMax(int n){
if (n < 1){
return;
}
char[] numbers = new char[n];
for (int i = 0; i < n; i++) {
numbers[i] = '0';
}
for (int i = 0; i < 10; i++) {
//第一个位置取0~9
numbers[0] = (char) (i + '0');
printToMaxRecursively(numbers,n,0);
}
}
/**
* 递归实现全排列
* @param number
* @param n
* @param index
*/
public static void printToMaxRecursively(char[] number, int n, int index){
if (index == n-1){
//到最后一位时打印数字
printNumber(number);
return;
}
for (int i = 0; i < 10; i++) {
number[index+1] = (char)(i+'0');
printToMaxRecursively(number,n,index+1);
}
}
/**
* 打印数字,去掉开头的0
* @param number
*/
private static void printNumber(char[] number){
boolean isBegin0 = true;
// int nLength = number.length;
for (char c : number) {
if (isBegin0 && c != '0') {
isBegin0 = false;
}
if (!isBegin0) {
System.out.print(c);
}
}
System.out.println();
}
}