12 打印1到最大的N位数(递归和非递归解法)
2016-06-01 16:17
351 查看
题目描述:
输入数字n,按顺序呢打印从1到最大的n 位十进制数,比如输入3,打印1 2 3 。。999
思路:构造一个二维数组,假如n=3,就构造一个3行的二维数组list
{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }
{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }
{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }
我们要做的是每次都从第一行,第二行,第三行分别选一个数字打印。 用一个数组 answer来选择 list中 第 i 行选第几列的数字。如answer[2]=3,则表示选择打印 list[2][3]
代码:
解法1:
解法2: 此非递归解法的思想有点类似加法器。
代码:
解法3:此解法是剑指offer提供的解法
代码:
测试结果:
输入数字n,按顺序呢打印从1到最大的n 位十进制数,比如输入3,打印1 2 3 。。999
思路:构造一个二维数组,假如n=3,就构造一个3行的二维数组list
{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }
{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }
{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }
我们要做的是每次都从第一行,第二行,第三行分别选一个数字打印。 用一个数组 answer来选择 list中 第 i 行选第几列的数字。如answer[2]=3,则表示选择打印 list[2][3]
代码:
解法1:
import java.util.ArrayList; public class Print1ToMaxN { public static void main(String[] args) { // TODO Auto-generated method stub int n = 2; ArrayList<int[]> list = new ArrayList<>(); // 实质是一个二维数组 int answer[] = new int ; // answer[i] 表示 二维数组中 第 i 行所选的 列 值。 假如 // answer[1]=6, // 那么就表示取二维数组 list[1][6] int num[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; for (int i = 0; i < n; i++) { list.add(num); // 生成二维数组 } recursive(0, n, answer, list); } private static void recursive(int index, int n, int[] answer, ArrayList<int[]> list) { // TODO Auto-generated method stub if (index == n) { // 递归结束条件 boolean beginWith0 = true; // 是否是0 开头 for (int i = 0; i < n; i++) { if (list.get(i)[answer[i]] != 0) { beginWith0 = false; } if (!beginWith0) { System.out.printf("%d", list.get(i)[answer[i]]); // list.get(i)[answer[i]] 表示 list[i][j] } } if (!beginWith0) { System.out.println(); } return; } for (answer[index] = 0; answer[index] < 10; answer[index]++) { recursive(index + 1, n, answer, list); // 递归 } } }
解法2: 此非递归解法的思想有点类似加法器。
代码:
import java.util.ArrayList; public class numberToPhone1 { public static void main(String[] args) { // int num[] = { 0, 1 }; int num[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; int n = 3; ArrayList<int[]> list = new ArrayList<>(); // 实质是一个二维数组 int answer[] = new int ; // answer[i] 表示 二维数组list 中 第 i 行所选的 列 值。 for (int i = 0; i < n; i++) { list.add(num); // 生成二维数组 } while (true) { // n为电话号码的长度 boolean beginWith0 = true; // 是否是0 开头 for (int i = 0; i < n; i++) { if (list.get(i)[answer[i]] != 0) { beginWith0 = false; } if (!beginWith0) { System.out.printf("%d", list.get(i)[answer[i]]); // list.get(i)[answer[i] 表示 list[i][j] } } if (!beginWith0) { System.out.printf("\n"); } int k = n - 1; while (k >= 0) { if (answer[k] < num.length - 1) { answer[k]++; break; } else { // 进位 answer[k] = 0; k--; } } if (k < 0) break; } } }
解法3:此解法是剑指offer提供的解法
代码:
public class Print1ToMaxN { public static void main(String[] args) { // TODO Auto-generated method stub int n = 3; print1ToMaxN(n); } private static void print1ToMaxN(int n) { // TODO Auto-generated method stub char number[] = new char ; recursivePrint(0, number, n); } private static void recursivePrint(int index, char[] number, int n) { // TODO Auto-generated method stub if (index == n) { boolean beginWith0 = true; for (int i = 0; i < n; i++) { if (number[i] != '0') { beginWith0 = false; } if (!beginWith0) { System.out.print(number[i]); } } if (!beginWith0) { System.out.println(); } return; } for (int i = 0; i < 10; i++) { number[index] = (char) ('0' + i); recursivePrint(index + 1, number, n); } } }
测试结果:
相关文章推荐
- Swift开篇009->方法
- 删除字符串中的指定字符(23)
- 在jdbc中使用properites文件进行使用
- Oracle数据库DOC命令导入导出(2014-3-10记)
- 通过http流发送post请求
- 练习2.21 2.23
- 88----oracle大对象,boolean,date的处理
- 1025. 反转链表 (25)
- 【54】Java反射机制剖析
- list接口
- 解决 .gitignore无效,不能过滤某些文件
- Linux信号说明列表
- 【54】Java反射机制剖析
- 【54】Java反射机制剖析
- caffe学习小问题(1):caffe中的Accuracy
- 系统分析员考试复习笔记-8 第八章 软件工程
- UITableView的cell表格刷新(增加,删除,修改)
- 信息系统项目管理师考试视频、录音打包下载
- Python缩进和冒号详解
- 判断设备终端是pc还是移动端