剑指 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. Slim Span POJ 3522 (最小差值生成树)

    题意: 最小生成树找出来最小的边权值总和使得n个顶点都连在一起.那么这找出来的边权值中的最大权值和最小权值之差就是本题的结果 但是题目要求让这个输出的结果最小,也就是差值最小.那么这就不是最小生成树了 ...

  2. hdu2196 Compute

    Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission ...

  3. PowerShell DSC学习资料

    官网 https://docs.microsoft.com/zh-cn/powershell/dsc/overview/overview CSDN中文博客(专题,32篇) https://blog.c ...

  4. java通过HttpClient调用接口总结

    2.HttpClient 2.1简介: 最近看项目的代码,看到工程中有两个jar包张的很像,一个是commons.httpclient-3.1.jar,一个是httpclient4.2.1.jar,很 ...

  5. RSA 加密解密使用实例

    http://www.dtmao.cc/news_show_692109.shtml 本文不讨论RSA加密解密本身,只记录使用方法及遇到的坑,RSA原理及注意事项可在网上查找. 背景:公司的一个需求, ...

  6. mybatis(一)常见ORM框架及JDBC操作工具类

      转载:https://www.cnblogs.com/wuzhenzhao/p/11075569.html 在Java 程序里面去连接数据库,最原始的办法是使用JDBC 的API.我们先来回顾一下 ...

  7. React hox

    React hox https://github.com/umijs/hox

  8. Free Serverless

    Free Serverless BFF https://cloud.google.com/functions/ 微服务 Function as a Servcie,FaaS https://segme ...

  9. VSCode & useful Extensions

    VSCode & useful Extensions Code Spell Checker bug user dictionary https://www.cnblogs.com/xgqfrm ...

  10. WEB 面向开发者的结构化数据

    通常用于google搜索 See also: video 探索搜索库