剑指offer12,打印1到最大的n位数(Java实现)

如果有不对的地方请发邮件到[email protected]。若是不太明白思路或者过程也可发邮件给我,谢谢支持。

/**
 * 题目:打印1到最大的n位数
 * 描述:输入数字n按顺序打印出1的最大的n位十进制数。
 * 此题肯定不能用传统的方法,因为当n很大的时候,long long 都会溢出
 * 所以我们采用字符串,递归递归递归
 * @author lenovo047
 *
 */
public class test12 {
    public static void solve(int n) {
        if(n <= 0)
            return;
        
        StringBuffer s = new StringBuffer(n);
        
        for(int i = 0; i < n; i++) {   //s目前全是0
            s.append('0');
        }
        
        for(int i = 0; i < 10; i++) {         //分别设置好了第0位,然后调用函数再逐个去补全后边的
            s.setCharAt(0, (char)(i+'0'));  //转型
            solve(s, n, 0);
            
        }
    }
    
    private static void solve(StringBuffer s, int n, int index) {  
        if (index == n - 1) {  //s的所有位都定义完之后才能输出
            printNumber(s);  //打印时去掉前边多余的0,不能是033333,应是33333
            return;  
        }  
  
        for (int i = 0; i < 10; i++) {  
            s.setCharAt(index + 1, (char) ('0' + i));   //设置后index的后边一位
            solve(s, n, index + 1);         //接着调用
        }  
  
  }
    
    private static void printNumber(StringBuffer s) {  
        boolean isBeginning0 = true;
        for (int i = 0; i < s.length(); i++) {  //逐位打印
            // 当找到第一个非0字符以后,把isBeginning0设置为false,后面的字符全部打印 ;不打印前边的0
            if (isBeginning0 && s.charAt(i) != '0') {  
                isBeginning0 = false;  
            }  
            if (!isBeginning0)  
                System.out.print(s.charAt(i));  //每一行是逐个打印
        }  
  
        System.out.println();  
    }

}
 

你可能感兴趣的:(剑指offer)