《剑指offer》面试题12 打印1到最大的n位数 Java版
书中方法:这道题的一个陷阱在于不能用int或者long去存储你要打印的数,然后用打印函数打印,因为这个数可能会很大。如果加1后超出了最大的n位数,就不打印了。用最高位是否进位判断是否结束,打印的时候注意不要打印出前面可能出现的0.
public void print(int n){
if(n<=0){
return;
}
//必须要用字符数组防止大数
char[] c = new char[n];
for(int i=0; i<n; i++){
c[i] = '0';
}
while(!increment(c)){
digitsPrint(c);
}
}
private boolean increment(char[] c){
boolean overflow = false;
//因为是加1,当作从小数进位了1.
int carry = 1;
//从个位开始计算
for(int i=c.length-1; i>=0; i--){
int sum = c[i] - '0' + carry;
//如果进位了
if(sum == 10){
if(i == 0){
overflow = true;
break;
}
carry = 1;
c[i] = '0';
}else{//如果没进位
c[i] = (char)('0' + sum);
break;
}
}
return overflow;
}
private void digitsPrint(char[] c){
int index = 0;
while(c[index] == '0'){
index++;
}
for(int i=index; i<c.length; i++){
System.out.print(c[i]);
}
System.out.println();
}
我的方法:看到“所有”和“打印”这样的关键字,很容易想到用回溯的方法去做,因为实质是求出所有组合,上面的方法也是为了能遍历到所有组合。和求字符串的全排列以及组合不同(题目28),这里字符可以重复使用(又联想到了打印n位以内数字不重复整数...这里不展开,后面再说)。回想一下我们打印字符串的全排列时,因为每个字符只能使用一次,所以我们得想办法保证每个字符只被选取一次(利用额外的数组或者交换)。现在我们只需要简单地在每个位子上选取可能出现的值,然后递归下去就行了。外层是一个控制长度的循环,内层为每一位选取数字,每一位上都有‘0’-‘9’字符可以选择(第一位除外)。
public void print2(int n){
if(n <= 0)return;
List<String> result = new ArrayList<String>();
String line = "";
//用n控制位数
for(int i=1; i<=n; i++){
find(result, line, 0, i);
}
for(String s : result){
System.out.println(s);
}
}
private void find(List<String> result, String line, int level, int border){
//每一位添加完毕后保存
if(level >= border){
result.add(new String(line));
return;
}
//用户保护原始的line,即保护现场(可百度这个关键词)
String temp = new String(line);
for(int i=0; i<=9; i++){
//第一位不能为0
if(level == 0 && i == 0){
continue;
}else{
//当前位添加
line += i;
//继续添加下一位
find(result, line, level+1, border);
//让line恢复,进入下次for循环
line = temp;
}
}
}
《剑指offer》面试题12 打印1到最大的n位数 Java版的更多相关文章
- 剑指Offer:面试题12——打印1到最大的n位数(java实现)
问题描述: 输入数字n,按顺序打印出从1到最大的n位十进制数,比如输入3,则打印出1,2,3一直到最大的3位数即999. 思路1:最简单的想法就是先找出最大的n位数,然后循环打印即可. public ...
- 剑指Offer - 九度1515 - 打印1到最大的N位数
剑指Offer - 九度1515 - 打印1到最大的N位数2013-11-30 01:11 题目描述: 给定一个数字N,打印从1到最大的N位数. 输入: 每个输入文件仅包含一组测试样例.对于每个测试案 ...
- 剑指Offer:面试题15——链表中倒数第k个结点(java实现)
问题描述 输入一个链表,输出该链表中倒数第k个结点.(尾结点是倒数第一个) 结点定义如下: public class ListNode { int val; ListNode next = null; ...
- 【剑指offer 面试题12】打印1到最大的n位数
思路: 用n位字符数组表示n位数,通过递归的方式逐层(位)遍历,递归终止时打印. #include "stdio.h" #include "string.h" ...
- 剑指offer面试题3 二维数组中的查找 (java)
注:java主要可以利用字符串的length方法求出长度解决这个问题带来方便 public class FindNum { public static void main(String[] args) ...
- 剑指offer面试题12-打印1到最大的n位数
题目: 输入一个数字n,按顺序打印出从1最大的n位十进制数.比方输入3,则打印出1.2.3最大的三位数即999 这道题的主要陷阱就在大数的处理,仅仅要将这个考虑进去,用字符串来表示.就好说了. 那差点 ...
- 剑指Offer:面试题29——数组中出现次数超过一半的数字(java实现)
PS:在前几天的面试中,被问到了这个题.然而当时只能用最低效的方法来解. 问题描述: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2, ...
- 剑指Offer:面试题7——用两个栈实现队列(java实现)
题目描述:用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 首先定义两个栈 Stack<Integer> stack1 = new Stack<I ...
- 剑指offer:1.找出数组中重复的数(java版)
数组中重复的数:题目:找出数组中重复的数,题目描述:在一个长度为n的数组里的所有数字都在0到n-1的范围内.数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任 ...
随机推荐
- unkown类型
1,任何类型的值都可以赋给 unkown类型 2. 如果没有类型断言或基于控制流的类型细化时 unknown 不可以赋值给其它类型,此时它只能赋值给 unknown 和 any 类型 3. 如果没有类 ...
- C++的命令行参数(gflag)
参考:https://www.cnblogs.com/myyan/p/4699940.html 这是一款google开源的命令行参数解析工具,支持从环境变量.配置文件读取参数(可以用gflags代替配 ...
- Java——GUI
[AWT] <1>AWT(Abstract Widow Toolkit)包含了很多类和接口,用于Java Application的GUI(Graphics User Interfac ...
- [洛谷3934]P3934 Nephren Ruq Insania题解
先放个奈芙莲 解法 看到这种题目就知道是欧拉降幂,然后根据某玄学证明,递归欧拉降幂从l到r不会超过\(\Theta(log_n)\),所以直接递归解决,然后区间修改直接树状数组维护一下 然后就A了 代 ...
- 【LOJ6225&网络流24题】火星探险问题(费用流)
题意: 思路: [问题分析] 最大费用最大流问题. [建模方法] 把网格中每个位置拆分成网络中两个节点<i.a>,<i.b>,建立附加源S汇T. 1.对于每个顶点i,j为i东边 ...
- Are We Ready for SDN? Implementation Challenges for Software-Defined Networks
Name of article:Are We Ready for SDN? Implementation Challenges for Software-Defined Networks Orig ...
- [转]SpeedPHP微信接口扩展
这个扩展实现了SP和微信公众平台的对接,1.0版暂时只实现了最简单的功能:绑定,收信息,回复信息. 扩展配置方法: $spConfig = array( 'mode' => 'debug ...
- Han Xin and His Troops
Han Xin and His Troops 中国剩余定理 JAVA板子 /*中国剩余定理,根据公式需要求取大数的逆元*/ import java.math.BigInteger; import ja ...
- Android单行跑马灯效果实现
参考网址:https://www.jianshu.com/p/e6c1b825d322 起初,使用了如下XML布局: <TextView android:id="@+id/tv_per ...
- MySQL主从复制 报错处理
基于GTID的主从复制: 跳过一个事务: SET @@session.gtid_next = '冲突的GTID号';BEGIN;COMMIT; SET gtid_next = 'AUTOMATIC';