【剑指offer】17、打印从1到最大的n位数

题目

输入数字n,按顺序打印从1到最大n位的十进制数。比如输入3,打印1到999。

思路

输入的数字可以很大,可以是33,65,这样的话int和long long都不能满足题目要求,所以这是一个大数问题。

大数问题经常用字符串来解决

我们当然可以用字符串来模拟加法

最方法的方法应该是做一个n位的全排列,每位可以取0~9

void Print1toMaxOfNDigits(int n){
  if (n <= 0)
    return;
  
  char* number = new char[n+1];
  number[n]=‘\0‘;

  for (int i = 0; i < 10; i++)
  {
    number[0] = i + ‘0‘;
    Print1ToMaxOfNDigitsRecursively(number,n,0);
  }
  delete[] number;
}

void Print1ToMaxOfNDigitsRecursively(char* number, int length, int index){
  if (index == length - 1)
  {
    PrintNumber(number);
    return;
  }
  
  for (int i = 0; i < 10; i++)
  {
    number[index+1] = i + ‘0‘;
    Print1ToMaxOfNDigitsRecursively(number, length, index + 1);
  }
}

void PrintNumber(char* Number){
  bool isBegin = true;
  int nLength = strlen(number);
  
  for (int i = 0; i < nLength; i++)
  {
    if (isBegin && number[i] != ‘0‘)
      isBegin = false;
    if (!isBegin)
      printf("%c", number[i]);
  }
  printf("\t");
}

原文地址:https://www.cnblogs.com/shiganquan/p/9339080.html

时间: 2024-08-29 22:58:01

【剑指offer】17、打印从1到最大的n位数的相关文章

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

基本思路 第一种方法:当我们只有对9999或者999或者99或9加1的时候,才会在第一个数字的基础上产生进位,而其他所有情况都不好在第一个数字上产生进位.因此当我们发现在加1的时候第一个数字产生了进位,则已经是最大的n位数,此时increment返回true,循环终止.代码如下: public class Print1ToMaxOfDigits { public static void main(String[] args) { Scanner sc = new Scanner(System.i

剑指offer:打印从1到最大的n位数

题目:输入数字n,按顺序从1打印到最大的n位十进制数.例如,输入3,则打印1, 2, 3, ..., 999 def printToMaxOfNDigits(n): """ 打印1, 2, ..., 99999(n个9) 可以从1开始然后用大数加法加到n个9,也可以使用递归方法实现 """ def helper(idx): # 递归出口就是设置完最后一位 if idx == n - 1: for j in range(n): if number[

剑指offer (12) 打印1到最大的n位数

题目描述: 给定一个数字N,打印从1到最大的N位数 此题需要注意以下几点: 1. 涉及到大数问题,因为并没有限定 n的取值范围,所以需要采取 字符数组模拟大数运算 2. 打印数字时 需要忽略前置0 3. 我们始终 以n位数为整体,n位所有十进制数其实是 n位从0到9的全排列,可以采用递归解决 我们从 数组下标0开始 (对应于数字最高位),每一位都有0到9取值,然后设置下一位,递归的结束条件是 设置位到了数组的最末端 1 void PrintNum(char* num) 2 { 3 char* c

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

题目描述: 给定一个数字N,打印从1到最大的N位数. 输入: 每个输入文件仅包含一组测试样例.对于每个测试案例,输入一个数字N(1<=N<=5). 输出: 对应每个测试案例,依次打印从1到最大的N位数. 样例输入: 1 样例输出: 1 2 3 4 5 6 7 8 9 解题思路: 直接通过n快速指定比最大的那个数大1的数,10,100,1000,10000,100000.... 输出,就行了... 代码: #include <stdio.h> int main(void){ int

剑指offer (20) 打印螺旋矩阵

题目描述: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字 class Solution { public: vector<int> spiralOrder(vector<vector<int> > &matrix) { vector<int> result; int nRows = matrix.size(); if (nRows == 0) return result; int nCols = matrix.at(0).size()

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

本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点. 思路 通常那样从头开始查找删除需要的时间为O(n),要在O(1)时间删除某结点,可以这样实现:设待删除结点i的下一个结点为j,把j的值复制到i,再把i的指针指向j的下一个结点,最后删除j,效果就相当于删除j. 注意特殊情况:1.当待删除结点i为尾结点时,无下一个结点,则只能从头到尾顺序遍历:2.当链

剑指offer 顺时针打印矩阵

题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10. 思路:一定要记住循环继续的条件是columns > start * 2,rows > start * 2; 一圈的打印分为四步: 第一步:无条件打印第一行,从左往右: 第二步:终止行号大于起始行号,打印最后一列,从上往下: 第

剑指offer(17)层次遍历树

题目: 从上往下打印出二叉树的每个节点,同层节点从左至右打印. public class Solution { ArrayList<Integer> list = new ArrayList<Integer>(); public ArrayList<Integer> PrintFromTopToBottom(TreeNode root) { if(root==null) return list; TreeNode node = root; Queue<TreeNo

[剑指Offer] 17.树的子结构

[思路]要查找树A中是否存在和树B结构一样的子树,可以分成两步: 1.第一步在树A中找到和B的根节点的值一样的结点R:即当前树A包含子树B,HasSubtree(...) 2.第二步再判断树A中以R为根结点的子树是不是包含和树B一样的结构.即当前树A是否是子树B,IsSubtree(...) 1 /* 2 struct TreeNode { 3 int val; 4 struct TreeNode *left; 5 struct TreeNode *right; 6 TreeNode(int x

【剑指offer】打印1到最大的n位数

题目:输入数字n,按顺序打印出从1最大的n位十进制数.比如输入3,则打印出1,2,3一直到最大的3位数即999. 此题很容易误入陷阱! //第一次解法,不幸调入陷阱 void print(int n) { if (n<1) { printf("Invalid Input!\n"); return; } long maxNum=(int)pow(10.0,n);//如果n很大,不论int还是long都会溢出 for (int i=0; i<maxNum; i++) { pri