劍指offer面試題12 列印1到最大的n位數
一、題目
輸入數字n,按順序列印出從1到最大的n位十進位制數。比如輸入3,就列印出1、2、3、一起到最大的3位數,即999。
二、思考與分析
這個題目看似簡單,但是當輸入的n很大時,求最大的n位數用整型或長整型都會溢位。這裡需要考慮大數問題。
三、實現
方法一:在字串上模擬數字加法
用字串或者陣列來表示大數,首先我們把字串中的每個數字都初始化為’0’,然後每一次為字串表示的數字加1,再列印出來。因此我們只需要做兩件事情:
* 在字串表達的數字上模擬加法;
* 把字串表達的數字列印出來;
public class PrintNNum {
public void print(int n) {
if (n <= 0) {
return;
}
char[] arr = new char[n + 1];
for (int i = 0; i < arr.length; i++) {
arr[i] = '0';
}
while (!imcrement(arr)) {
printNum(arr);
}
}
//在字串表示的數字上加1
private boolean imcrement(char[] arr) {
int len = arr.length - 1;
while (arr[len] == '9') {// 從字元的最右邊開始,如果為‘9’就置‘0’,直到不是‘9’就將該位加1
arr[len] = '0';
len--;
}
arr[len] += 1;
if (arr[0] == '1') {
return true;
}
return false;
}
/*
* 按照我們的閱讀習慣,將字串表示的數字列印出來
* 即只有在碰到第一個非0的字元之後才開始列印,直到字串的結尾
*/
private void printNum(char[] arr) {
int isBegin0 = 0;
for (int i = 0; i < arr.length; i++) {
if (arr[i] == '0' && isBegin0 == 0) {
continue;
} else {
isBegin0 = 1;
}
if (isBegin0 == 1) {
System.out.print(arr[i]);
}
}
}
}
注意:
我們在建立陣列時,建立了n+1位的陣列,當加到最大的n位數時,即99…9時,再加1,就會在第一個字元(下標為0)的位置產生進位,當該位置產生進位時,則表示迴圈應該結束了。這樣也實現了用O(1)時間判斷是否已經到了最大的n位數。
方法二:將問題轉換成數字排列
我們把問題換個思路考慮,會發現n位所有十進位制數其實就是n個從0到9的全排列。也就是說,我們把數字的每一位都 從0到9排列一遍,就可以得到所有的十進位制數。只是在列印的時候,排在數字前面的0不列印出來而已。
全排列用遞迴很容易表達,數字的每一位都可能是0~9中的一個數,然後設定下一位,遞迴結束的條件是我們已經設定好了數字的最後一位。
//全排列實現列印
private void printToMaxOfNDigits(int n){
if(n <= 0){
return;
}
char[] arr = new char[n];
for (int i = 0; i < 10; i++) {
arr[0] = (char) ('0'+i);
printToMaxOfNDigitsRecursively(arr,n,0);
}
}
private void printToMaxOfNDigitsRecursively(char[] arr, int n, int index) {
if(index == n-1){
printNum(arr);
System.out.print("、");
return;
}
for (int i = 0; i < 10; i++) {
arr[index+1] = (char) (i+'0');
printToMaxOfNDigitsRecursively(arr, n, index+1);
}
}
相關文章
- 劍指 Offer 列印從1到最大n位數c++C++
- 劍指Offer-17-列印從1到最大的n位數-Java程式碼實現(兩種思路)Java
- 【Algorithm】《劍指offer》面試題32----從1到n整數中1出現的次數Go面試題
- LeetCode題解(Offer17):列印從1到最大的n位數(Python)LeetCodePython
- 【演算法詳解】列印1到最大的n位數演算法
- [每日一題] 第二十四題:列印從1到最大的n位數每日一題
- 劍指offer面試題29:順時針列印矩陣面試題矩陣
- 劍指Offer面試題5(Java版):從尾到頭列印連結串列面試題Java
- 劍指offer面試題11 數值的整數次方面試題
- 【劍指offer】二進位制中1的個數
- 劍指 Offer 15. 二進位制中1的個數
- 劍指Offer--面試題1:賦值運算子函式面試題賦值函式
- 劍指offer面試題14 調整陣列順序使奇數位於偶數前面面試題陣列
- GitHub#algorithm#:《劍指offer》 的50道面試題GithubGo面試題
- 劍指offer-從尾到頭列印連結串列-phpPHP
- 「劍指offer」27道Mybatis面試題含解析MyBatis面試題
- 【劍指offer中等部分4】二進位制中1的個數(java)Java
- 《劍指offer》:[64]資料流中的中位數
- 劍指offer之順序列印陣列陣列
- 【劍指offer】順時針列印矩陣矩陣
- 【劍指Offer學習】【面試題14 :調整陣列順序使奇數位於偶數前面】面試題陣列
- 劍指offer面試題(41-50)——java實現面試題Java
- 劍指 Offer 63. 股票的最大利潤-Python題解Python
- 劍指offer-例題 連續子陣列的最大和陣列
- 劍指offer之列印超過陣列一半的數字陣列
- 劍指Offer題解合集
- 劍指Offer 表示數值的字串字串
- 劍指 offer(1) -- 陣列篇陣列
- 【劍指offer】連續子陣列的最大和陣列
- 劍指offer刷題之路--1.陣列中重複的數字陣列
- 1. 二位陣列中的查詢(劍指offer)陣列
- 【劍指offer】字串轉整數字串
- 劍指offer 面試題47:不用加減乘除做加法面試題
- [劍指offer題解][Java]佇列的最大值/滑動視窗的最大值Java佇列
- 劍指offer面試18 樹的子結構面試
- 劍指offer刷題記錄
- [劍指offer] 把二叉樹列印成多行二叉樹
- 劍指offer-19:順時針列印矩陣矩陣