剑指 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位数的更多相关文章

  1. 力扣 - 剑指 Offer 17. 打印从1到最大的n位数

    题目 剑指 Offer 17. 打印从1到最大的n位数 思路1 如果有n位,那么最大值就是\(10^n-1\),即如果n是2,那么最大就到输出到99 考虑到大数情况,所以使用字符数组 还要把字符数组转 ...

  2. [LeetCode]剑指 Offer 17. 打印从1到最大的n位数

    输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数.比如输入 3,则打印出 1.2.3 一直到最大的 3 位数 999. 示例 1: 输入: n = 1 输出: [1,2,3,4,5,6,7, ...

  3. 剑指Offer:打印从1到最大的n位数

    题目:输入数值n,按顺序打印从1到最大的n位数,例如输入n=3,则从1,2,3,一直打印到999 陷阱:若使用循环遍历 1- 999...9 并依次输出,当位数n过大时,无论将其存入int或long或 ...

  4. 剑指offer——18打印从1到最大的n位数

    题目: 输入数字n,按顺序打印出从1到最大的n位十进制数.比如输入3,则打印出1.2.3一直到最大的3位数999. 题解: 注意大数溢出问题,故使用字符串更靠谱 class Solution { pu ...

  5. 【Java】 剑指offer(16) 打印1到最大的n位数

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 输入数字n,按顺序打印出从1最大的n位十进制数.比如输入3,则打印 ...

  6. 【剑指offer】打印1到最大的n数字

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/25562105 剑指offer第12题.九度OJ測试通过. 题目描写叙述: 给定一个数字N, ...

  7. 【Java】 剑指offer(17) 在O(1)时间删除链表结点

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除 ...

  8. 剑指OFFER之打印1到最大的N位数(九度OJ1515)

    题目描述: 给定一个数字N,打印从1到最大的N位数. 输入: 每个输入文件仅包含一组测试样例.对于每个测试案例,输入一个数字N(1<=N<=5). 输出: 对应每个测试案例,依次打印从1到 ...

  9. 剑指offer(17)层次遍历树

    题目: 从上往下打印出二叉树的每个节点,同层节点从左至右打印. public class Solution { ArrayList<Integer> list = new ArrayLis ...

随机推荐

  1. python的threading的使用(join方法,多线程,锁threading.Lock和threading.Condition

    一.开启多线程方法一 import threading,time def write1(): for i in range(1,5): print('1') time.sleep(1) def wri ...

  2. HDU3544 Alice's Game && POJ 2960 S-Nim(SG函数)

    题意: 有一块xi*Yi的矩形巧克力,Alice只允许垂直分割巧克力,Bob只允许水平分割巧克力.具体来说,对于Alice,一块巧克力X i * Y i,只能分解成a * Y i和b * Y i其中a ...

  3. 571A Lengthening Sticks

    time limit per test 1 second memory limit per test 256 megabytes input standard input output standar ...

  4. Codeforces Round #673 (Div. 2) B. Two Arrays (贪心)

    题意:给你一组数\(a\)和一个数\(T\),将这组数分为两组\(c\)和\(d\),定义\(f(x)\)为数组\(x\)中任意两个不同元素的和为\(T\)的个数,问为了使\(min(f(c)+f(d ...

  5. java的两性

    java具有解释与编译两种特性 本来是昨天的,可以文件丢失了......(我没有偷懒哦,没有!) 所以凭记忆随便写了点 解释就像直接翻译一本书拿给别人看,编译就像找个翻译官一句句翻译给你t听 解释型( ...

  6. K8S(10)配置中心实战-configmap资源

    k8s配置中心实战-configmap资源 目录 k8s配置中心实战-configmap资源 0 configmap前置说明 0.1.1 configmap和secret 0.1.2 怎么使用conf ...

  7. haut-1280 诡异的迷宫

    1280: 诡异的迷宫 时间限制: 2 秒  内存限制: 128 MB提交: 174  解决: 27提交 状态 题目描述 Simple最近刷题(打游戏)刷多了,一觉醒来发现自己到了一个迷宫里,怎么也出 ...

  8. Netty(三)基于Bio和Netty 的简易版Tomcat

    参考代码: https://github.com/FLGBetter/tomcat-rpc-demo

  9. mybatis(二)全局配置mybatis-config.xml

    转载:https://www.cnblogs.com/wuzhenzhao/p/11092526.html 大部分时候,我们都是在Spring 里面去集成MyBatis.因为Spring 对MyBat ...

  10. Linux bash script regex auto replace

    Linux bash script regex auto replace 自动替换 /assets/css/0.styles.96df394b.css => ./assets/css/0.sty ...