【剑指Offer】打印从1到最大的n位数

打印从1到最大的n位数

题目:输入数字n,按顺序打印出从1到最大的n位十进制数。比如输入3,则打印出1、2、3一直到最大的3位数999。

package jianzhioffer;

import java.util.Scanner;

/**
 * 剑指Offer:打印从1到最大的n位数
 */
public class Print1ToNMaxOfNDigits {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            int n = Integer.parseInt(sc.nextLine());
            print1ToMaxOfNDigits(n);
        }
        sc.close();
    }

    /**
     * 把问题转换成数字排列的解法,使用递归
     *
     * @param n
     */
    private static void print1ToMaxOfNDigits(int n) {
        if (n <= 0)
            return;
        char[] number = new char[n];
        for (int i = 0; i < number.length; i++) {
            number[i] = '0';
        }
        for (int i = 0; i < 10; i++) {
            number[0] = (char) (i + '0');
            print1ToMaxOfNDigitsRecursively(number, n, 0);
        }
    }

    private static void print1ToMaxOfNDigitsRecursively(char[] number, int length, int index) {
        if (index == length - 1) {
            printNumber(number);
            return;
        }
        for (int i = 0; i < 10; i++) {
            number[index + 1] = (char) (i + '0');
            print1ToMaxOfNDigitsRecursively(number, length, index + 1);
        }
    }

    /**
     * 在字符串上模拟数字加法
     *
     * @param n
     */
//    private static void print1ToMaxOfNDigits(int n) {
//        if (n <= 0)
//            return;
//        char[] number = new char[n];
//        for (int i = 0; i < number.length; i++) {
//            number[i] = '0';
//        }
//
//        while (!increment(number)) {
//            printNumber(number);
//        }
//    }

//    private static boolean increment(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)
//                nSum++;
//            if (nSum >= 10) {
//                if (i == 0)
//                    isOverflow = true;
//                else {
//                    nSum -= 10;
//                    nTakeOver = 1;
//                    number[i] = (char) ('0' + nSum);
//                }
//            } else {
//                number[i] = (char) ('0' + nSum);
//                break;
//            }
//        }
//        return isOverflow;
//    }
    private static void printNumber(char[] number) {
        boolean isBeginning = true;
        int nLength = number.length;
        for (int i = 0; i < nLength; i++) {
            if (isBeginning && number[i] != '0')
                isBeginning = false;
            if (!isBeginning) {
                System.out.print(number[i]);
            }
        }
        System.out.println();
    }
}

 

你可能感兴趣的:(数据结构与算法,学习历程记录)