剑指 Offer 17. 打印从1到最大的n位数
剑指 Offer 17. 打印从1到最大的n位数
Offer 17
- 题目解析:

- 暴力解法
package com.walegarrett.offer;
/**
* @Author WaleGarrett
* @Date 2021/1/25 16:16
*/
public class Offer_17 {
public int[] printNumbers(int n) {
int maxlen = (int) Math.pow(10.0, n * 1.0);
maxlen -= 1;
int []result = new int[maxlen];
for(int i = 0; i< maxlen; i++){
result[i] = i+1;
}
return result;
}
}
- 字符串模拟大数解法:
class Solution {
int [] result;
int index = 0;
public int[] printNumbers(int n) {
StringBuilder num = new StringBuilder();
result = new int[ (int) (Math.pow(10.0, n * 1.0) - 1)];
for(int i=0; i<n; i++)
num.append('0');
while(!isOverFlow(num)){
printNums(num);
}
return result;
}
/**
* 用以判断是否溢出:例如3位数999,1000即表示溢出
* @param now
* @return
*/
boolean isOverFlow(StringBuilder now){
boolean isoverflow = false;
int carry = 0;
for(int i = now.length()-1; i >= 0; i--){
int current = Integer.parseInt("" + now.charAt(i)) + carry;
if(i == now.length() -1)
current += 1;
//将产生进位
if(current >= 10){
if(i == 0)
isoverflow = true;//产生溢出,到达首位
else{
carry = 1;
now.setCharAt(i, String.valueOf(current - 10).charAt(0));
}
}else{//没有产生进位
now.setCharAt(i, String.valueOf(current).charAt(0));
break;//没有进位则表示不用继续模拟加法了
}
}
return isoverflow;
}
void printNums(StringBuilder now){
boolean isZero = false;
String temp = "";
for(int i =0; i< now.length(); i++){
if(isZero && now.charAt(i) != '0')
isZero = false;
if(!isZero)
temp += now.charAt(i);
}
result[index++] = Integer.parseInt(temp);
}
}
- 全排列递归解法:
解题思路:

复杂度分析:

package com.walegarrett.offer;
/**
* @Author WaleGarrett
* @Date 2021/1/25 21:24
*/
public class Offer_17_2 {
int [] result;
int index = 0;
int n, start, nineNum;
char []chars;
public int[] printNumbers(int n) {
this.n = n;
start = n - 1;
chars = new char[n];
result = new int[ (int) (Math.pow(10.0, n * 1.0) - 1)];
nineNum = 0;
dfs(0);
return result;
}
void dfs(int cnt){
if(cnt == n){
//start表示起始数字,排除0开始的子串
String ans = String.valueOf(chars).substring(start);
if(!ans.equals("0"))
result[index++] = Integer.parseInt(ans);
if(n - start == nineNum)
start--;//需要进位
return;
}
for(int i=0; i<10; i++){
char now = String.valueOf(i).charAt(0);
if(i == 9)
nineNum++;//
//固定一个位数
chars[cnt] = now;
dfs(cnt + 1);
}
//结束循环,9的个数减一
nineNum--;
}
}
剑指 Offer 17. 打印从1到最大的n位数的更多相关文章
- 力扣 - 剑指 Offer 17. 打印从1到最大的n位数
题目 剑指 Offer 17. 打印从1到最大的n位数 思路1 如果有n位,那么最大值就是\(10^n-1\),即如果n是2,那么最大就到输出到99 考虑到大数情况,所以使用字符数组 还要把字符数组转 ...
- [LeetCode]剑指 Offer 17. 打印从1到最大的n位数
输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数.比如输入 3,则打印出 1.2.3 一直到最大的 3 位数 999. 示例 1: 输入: n = 1 输出: [1,2,3,4,5,6,7, ...
- 剑指Offer:打印从1到最大的n位数
题目:输入数值n,按顺序打印从1到最大的n位数,例如输入n=3,则从1,2,3,一直打印到999 陷阱:若使用循环遍历 1- 999...9 并依次输出,当位数n过大时,无论将其存入int或long或 ...
- 剑指offer——18打印从1到最大的n位数
题目: 输入数字n,按顺序打印出从1到最大的n位十进制数.比如输入3,则打印出1.2.3一直到最大的3位数999. 题解: 注意大数溢出问题,故使用字符串更靠谱 class Solution { pu ...
- 【Java】 剑指offer(16) 打印1到最大的n位数
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 输入数字n,按顺序打印出从1最大的n位十进制数.比如输入3,则打印 ...
- 【剑指offer】打印1到最大的n数字
转载请注明出处:http://blog.csdn.net/ns_code/article/details/25562105 剑指offer第12题.九度OJ測试通过. 题目描写叙述: 给定一个数字N, ...
- 【Java】 剑指offer(17) 在O(1)时间删除链表结点
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除 ...
- 剑指OFFER之打印1到最大的N位数(九度OJ1515)
题目描述: 给定一个数字N,打印从1到最大的N位数. 输入: 每个输入文件仅包含一组测试样例.对于每个测试案例,输入一个数字N(1<=N<=5). 输出: 对应每个测试案例,依次打印从1到 ...
- 剑指offer(17)层次遍历树
题目: 从上往下打印出二叉树的每个节点,同层节点从左至右打印. public class Solution { ArrayList<Integer> list = new ArrayLis ...
随机推荐
- c语言实现--单向循环链表操作
1,什么叫单向循环链表.单向循环链表是指在单链表的基础上,表的最后一个元素指向链表头结点,不再是为空. 2,由图可知,单向循环链表的判断条件不再是表为空了,而变成了是否到表头. 3,链表的结点表示 1 ...
- hdu3706 Second My Problem First
Problem Description Give you three integers n, A and B. Then we define Si = Ai mod B and Ti = Min{ ...
- 牛客的两道dfs
1.传送门:牛客13594-选择困难症 题意:给你k类物品,每类物品有a[i]个每个物品都有一个value,每类物品最多选一个,要求有多少种选法使得总value>m(没要求每类物品都必须选) 题 ...
- Relatives POJ - 2407 欧拉函数
题意: 给你一个正整数n,问你在区间[1,n)中有多少数与n互质 题解: 1既不是合数也不是质数(1不是素数) 互质是公约数只有1的两个整数,叫做互质整数.公约数只有1的两个自然数,叫做互质自然数 所 ...
- 洛谷 P3385 【模板】负环 (SPFA)
题意:有一个\(n\)个点的有向图,从\(1\)出发,问是否有负环. 题解:我们可以用SPFA来进行判断,在更新边的时候,同时更新路径的边数,因为假如有负环的话,SPFA这个过程一定会无限重复的遍历这 ...
- PowerShell随笔6---ISE
简单的命令可以通过控制台窗口输入执行,但是我的脚本逻辑复杂,需要保存.总不能在命令行工具中执行吧. 关了窗口,啥都没了.有没有一个IDE,有. 在PowerShell命令行窗口中输入:ISE,就会打开 ...
- 在4.0框架下使用Sqlite数据库
在4.0框架下使用Sqlite数据库出现"混合模式程序集是针对"v2.0.50727"版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集. ...
- 电影推荐系统---协同过滤算法(SVD,NMF)
SVD 参考 https://www.zybuluo.com/rianusr/note/1195225 1 推荐系统概述 1.1 项目安排 1.2 三大协同过滤 1.3 项目开发工具 ...
- scu-4440 rectangle (非原创)
Rectangle frog has a piece of paper divided into nn rows and mm columns. Today, she would like to dr ...
- Leetcode(884)-索引处的解码字符串
给定一个编码字符串 S.为了找出解码字符串并将其写入磁带,从编码字符串中每次读取一个字符,并采取以下步骤: 如果所读的字符是字母,则将该字母写在磁带上. 如果所读的字符是数字(例如 d),则整个当前磁 ...