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

Offer 17

  • 题目解析:

  • 暴力解法
  1. package com.walegarrett.offer;
  2. /**
  3. * @Author WaleGarrett
  4. * @Date 2021/1/25 16:16
  5. */
  6. public class Offer_17 {
  7. public int[] printNumbers(int n) {
  8. int maxlen = (int) Math.pow(10.0, n * 1.0);
  9. maxlen -= 1;
  10. int []result = new int[maxlen];
  11. for(int i = 0; i< maxlen; i++){
  12. result[i] = i+1;
  13. }
  14. return result;
  15. }
  16. }
  • 字符串模拟大数解法:
  1. class Solution {
  2. int [] result;
  3. int index = 0;
  4. public int[] printNumbers(int n) {
  5. StringBuilder num = new StringBuilder();
  6. result = new int[ (int) (Math.pow(10.0, n * 1.0) - 1)];
  7. for(int i=0; i<n; i++)
  8. num.append('0');
  9. while(!isOverFlow(num)){
  10. printNums(num);
  11. }
  12. return result;
  13. }
  14. /**
  15. * 用以判断是否溢出:例如3位数999,1000即表示溢出
  16. * @param now
  17. * @return
  18. */
  19. boolean isOverFlow(StringBuilder now){
  20. boolean isoverflow = false;
  21. int carry = 0;
  22. for(int i = now.length()-1; i >= 0; i--){
  23. int current = Integer.parseInt("" + now.charAt(i)) + carry;
  24. if(i == now.length() -1)
  25. current += 1;
  26. //将产生进位
  27. if(current >= 10){
  28. if(i == 0)
  29. isoverflow = true;//产生溢出,到达首位
  30. else{
  31. carry = 1;
  32. now.setCharAt(i, String.valueOf(current - 10).charAt(0));
  33. }
  34. }else{//没有产生进位
  35. now.setCharAt(i, String.valueOf(current).charAt(0));
  36. break;//没有进位则表示不用继续模拟加法了
  37. }
  38. }
  39. return isoverflow;
  40. }
  41. void printNums(StringBuilder now){
  42. boolean isZero = false;
  43. String temp = "";
  44. for(int i =0; i< now.length(); i++){
  45. if(isZero && now.charAt(i) != '0')
  46. isZero = false;
  47. if(!isZero)
  48. temp += now.charAt(i);
  49. }
  50. result[index++] = Integer.parseInt(temp);
  51. }
  52. }
  • 全排列递归解法:

    • 解题思路:

    • 复杂度分析:

  1. package com.walegarrett.offer;
  2. /**
  3. * @Author WaleGarrett
  4. * @Date 2021/1/25 21:24
  5. */
  6. public class Offer_17_2 {
  7. int [] result;
  8. int index = 0;
  9. int n, start, nineNum;
  10. char []chars;
  11. public int[] printNumbers(int n) {
  12. this.n = n;
  13. start = n - 1;
  14. chars = new char[n];
  15. result = new int[ (int) (Math.pow(10.0, n * 1.0) - 1)];
  16. nineNum = 0;
  17. dfs(0);
  18. return result;
  19. }
  20. void dfs(int cnt){
  21. if(cnt == n){
  22. //start表示起始数字,排除0开始的子串
  23. String ans = String.valueOf(chars).substring(start);
  24. if(!ans.equals("0"))
  25. result[index++] = Integer.parseInt(ans);
  26. if(n - start == nineNum)
  27. start--;//需要进位
  28. return;
  29. }
  30. for(int i=0; i<10; i++){
  31. char now = String.valueOf(i).charAt(0);
  32. if(i == 9)
  33. nineNum++;//
  34. //固定一个位数
  35. chars[cnt] = now;
  36. dfs(cnt + 1);
  37. }
  38. //结束循环,9的个数减一
  39. nineNum--;
  40. }
  41. }

剑指 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. 在eclipse完成对Java_web项目里面资源文件的读取

    Java_web项目的资源文件一般有两种: 一种是存放数据之间有联系的文件,使用xml文件 另一种是存放数据之间没有联系的文件,使用properties文件 这里我们对properties文件读写做示 ...

  2. 【noi 2.6_7113】Charm Bracelet(DP)

    题意:N个饰物,有重量和渴望程度.问在M的重量限制内能达到的最大的渴望度. 解法:经典的01问题,但有一个小技巧值得记住:用if比较大小比调用max函数快了不少,这题有100ms左右. 1 #incl ...

  3. JavaScript函数console、this关键字

    console.dir()打印出来的东西不加任何操作 console.log()打印出来东西实现进行了操作,打印出来的东西可能不是原型 具体对象的类型可以在"_proto_"中看, ...

  4. springboot源码解析-管中窥豹系列

    一.前言 Springboot源码解析是一件大工程,逐行逐句的去研究代码,会很枯燥,也不容易坚持下去. 我们不追求大而全,而是试着每次去研究一个小知识点,最终聚沙成塔,这就是我们的springboot ...

  5. ucosIII学习笔记——钩子函数

    一开始听见钩子函数感觉很莫名其妙,更不知道它有何作用,这是第一篇博客,也是学习ucosIII操作系统的一个开始吧. 在系统中有开发者自己创建的任务也有系统内部任务 ,UCOSIII中有五个系统任务,分 ...

  6. Redis 事务 & 消息队列

    Redis 消息队列介绍 什么是消息队列 消息队列(Message Queue)是一种应用间的通信方式,消息发送后可以立即返回,有消息系统来确保信息的可靠传递,消息生产者只管把消息发布到消息队列中而不 ...

  7. ajax和comet

    一,XMLHttpRequest对象 IE5是最早引入XHR对象的浏览器,XHR对象是通过MSXML库中的一个ActiveX对象实现的 使用MSXML库中的XHR对象,编写一个函数如下 functio ...

  8. 使用 js 实现十大排序算法: 堆排序

    使用 js 实现十大排序算法: 堆排序 堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法. 大顶堆:每个节点的值都大于或等于其子节点的值,在堆排序算法中用于升序排列: 小顶堆:每个 ...

  9. html5 useful skills blogs

    html5 useful skills blogs preload & prefetch https://www.30secondsofcode.org/snippet/ary blogs h ...

  10. vue 使用stylus

    λ yarn add stylus stylus-loader --dev <style scoped lang="stylus"> div color #ff4488 ...