(《劍指offer》筆記)打印從1到最大的N位十進制數

題目:輸入數字n,按順序打印出從1到最大的n位十進制數。

分析:將n位數看做排列組合問題,有3個位置,每個位上從0到9中選一個數字放進去,求所有的排列情況。

三個位置是依次放進去數字的,這可以用遞歸。

每個位置上0到9的十種情況可以用for循環來遍歷。


另外,記得函數最開始進入時要檢查邊界條件。

public class Print1ToMaxOfNDigits {
	
	
	/**打印從1到最大的N位十進制數
	 * @param n 位數
	 */
	public static void print1ToMaxOfNDigits(int n){
		//先檢查邊界條件
		if(n<=0)
			return;
		char[] result=new char[n];
		printRecursively(result,0);
	}

	/** 將n位數看做排列組合問題,每個位上從0到9中選一個數字,這樣n位數可以在遞歸中形成。
	 * @param result 存儲n位數,每個元素是一位
	 * @param index 第index位從0到9中取一個數字。第index位取完數字後,index加1,遞歸,讓下一位選數字。直到i等於result的長度爲止,
	 * 這時n位數就形成了,打印它,回退一步改變最後位置的數字。這樣遞歸下去直到所有數字都打印完畢
	 */
	private static void printRecursively(char[] result, int index) {
		if (index==result.length) {
			printNumber(result);
			return;
		}
		for(int i=0;i<10;i++){
			result[index]=(char) (i+'0');
			printRecursively(result, index+1);
		}
		
	}

	/** 高位是0的話不打印,直到遇到不是0的數字爲止,截取這一位直到結束的字符串,打印之。
	 * @param result
	 */
	private static void printNumber(char[] result) {
		// TODO Auto-generated method stub
		String s=String.valueOf(result);
		for (int i = 0; i < result.length; i++) {
			if (result[i]!='0') {
				System.out.println(s.substring(i));
				return;
			}
		}
	}
	
	public static void main(String[] args){
		print1ToMaxOfNDigits(2);
	}

}


發佈了54 篇原創文章 · 獲贊 13 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章