剑指Offer(第二版)面试题17:打印从1到最大的n位数

2024年最全iOS开发 C语言使用笔记 PKCS12 openssl 改 p12密码,C C++面试基础知识 【代码】2024年最全iOS开发 C语言使用笔记 PKCS12 openssl 改 p12密码,C C++面试基础知识。 阅读详情

剑指Offer(第二版)面试题17:打印从1到最大的n位数

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

比如输入3,打印1,2,3一直到最大的3位数即999。

思路

如果面试题是关于n位的整数并且没有限定n的取值范围,或者输入任意大小的整数,那么这道题目很有可能是需要考虑大数问题的。字符串是一种简单、有效表示大数的方法。

代码

  • 在字符串上模拟数字加法的解法,绕过陷阱。如何快速判断在增加了1过后,是否到达了最大的n位数是本题的一个小陷阱。
bool Increment(char* number)
{
    bool isOverflow = false;
    int nTakeOver = 0;
    int nLength = strlen(number);
    for (int i = nLength - 1; i>=0; i--)
    {
        int nSum = number[i] - '0' + nTakeOver;
        if(i == nLength - 1)
            nSum++;
        if(nSum >= 10)
        {
            if(i == 0)
                isOverflow = true;
            else
            {
                nSum -= 10;
                nTakeOver = 1;
                number[i] = '0' + nSum;
            }
        }
        else
        {
            number[i] = '0' + nSum;
            break;
        }
    }

    return isOverflow;
}
  • 把问题转换位数字排列的解法,递归让代码更简洁
#include <iostream>

using namespace std;

void Print1ToMaxOfNDigits(int n);
void Print1ToMaxOfNDigitsRecursively(char* number, int length, int index);
void PrintNumber(char* number);

int main()
{
    int n;
    cin >> n;
    while(n != -666)
    {
        Print1ToMaxOfNDigits(n);
        cin >> n;
    } 
    return 0;
}

void Print1ToMaxOfNDigits(int n)
{
    if(n <= 0)
        return;

    char* number = new char[n + 1];
    memset(number,'0',n);
    number[n] = '\0';

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

    return;
}
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] = '0' + i;
        Print1ToMaxOfNDigitsRecursively(number,length,index + 1);
    }

    return;
}
void PrintNumber(char* number)
{
    bool isBeginning0 = true;
    int len = strlen(number);

    for(int i = 0; i < len; ++i)
    {
        if(isBeginning0 && number[i] != '0')
            isBeginning0 = false;

        if(!isBeginning0)
        {
            cout<<number[i];
        }
    }

    if(!isBeginning0)
        cout<<'\t';
    return;
}
数字孪生实战:如何用Blender+Unity快速搭建未来工厂3D模型(附资源包) 本文提供了一套利用Blender进行三维建模,再结合Unity构建虚拟仿真环境的实用方案,旨在帮助中小型制造企业低成本、高效率地搭建未来工厂数字孪生原型系统。文章详细介绍了从数据规划、模型优化到场景构建、逻辑仿真与数据对接的全流程,并附有资源包,助力技术团队快速实现从静态展示到动态交互的数字孪生应用。 阅读详情

相关推荐

跨境TRS投资实战:从开户到交易的完整系统解析

本文系统解析了跨境TRS(总收益互换)投资的完整实战流程。详细阐述了TRS作为境外资金投资A股的灵活工具,如何通过其独特的合约结构绕开港股通限制,并提供杠杆效应。内容涵盖从选择机构、开通账户、资金管理到核心交易操作的全过程,并强调了构建包含策略、风控与心态的完整投资系统的重要性。

weixin_29233333的博客 312

【剑指Offer】剪绳子问题——四种解法

剪绳子问题——四种解法题目描述:输入描述:返回值描述:示例1:解题思路:方法1:暴力递归方法2:记忆化递归方法三:动态规划方法四,数学原理 题目描述: 给你一根长度为n的绳子,请把绳子剪成整数长的m段(m、n都是整数,n>1并且m>1,m<=n),每段绳子的长度记为k[1],…,k[m]。请问k[1]x…xk[m]可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。 输入描述: 输入一个数n(2<=n<=60) 返回

小哲的博客 4774

ESP32+ST7789 LCD屏实战:5分钟搞定中文显示与图片渲染(附完整代码)

本文提供了一份详细的ESP32驱动ST7789 LCD屏幕的实战指南。通过清晰的SPI硬件连接说明、ESP-IDF框架下的初始化代码,以及图片渲染与中文字库构建的核心算法,帮助开发者快速实现中文显示与图片渲染功能,并附有完整的代码示例和性能优化技巧。

weixin_29189377的博客 436

剑指offer面试题14-I:剪绳子

思路一:贪心算法 推论一: 将绳子 以相等的长度等分为多段 ,得到的乘积最大。 推论二: 尽可能将绳子以长度 33 等分为多段时,乘积最大。 核心思路是:尽可能把绳子分成长度为3的小段,这样乘积最大。 步骤如下: (1)如果 n === 4,返回4 (2)如果 n > 4,分成尽可能多的长度为3的小段,每次循环长度n减去3,乘积res乘以3;最后返 回时乘以小于等于4的最后一小段 class Solution { public: int cuttingRop...

weixin_39035802的博客 782

从零搭建自动驾驶仿真环境:我的Nuplan-devkit实战笔记(含PyCharm配置技巧)

本文详细记录了从零搭建Nuplan-devkit自动驾驶仿真环境的完整流程,包括conda环境配置、pip版本控制、PyCharm专业版集成等关键步骤。特别针对Ubuntu系统下的依赖管理、数据目录优化和性能调优提供了实用技巧,帮助开发者高效构建稳定的自动驾驶仿真开发环境。

weixin_30505225的博客 479

NC65实现Restful接口开发及调试

NC65实现Restful接口开发及调试

linzhongshu的专栏 2144

【六分钟学算法-剑指offer系列】13.剪绳子

【六分钟学算法】13.剪绳子

姚先生的全栈之路 967

解决ArcGIS-OpenStreetMap Toolbox-Load OSM File错误

在安装成功OpenStreetMap Toolbox后,首次运行Load OSM File工具,出现以下错误

Zjf的博客 8819

【力扣】第 24 天 数学(中等)

剑指 Offer 14- I. 剪绳子 给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]…k[m-1] 。请问 k[0]k[1]…*k[m-1] 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。 题解 尽可能将绳子以长度 3 等分为多段时,乘积最大。 当 n≤3n \leq 3n≤3时,按照规则应不切分,但由于题目要求必须剪成 m>1 段

毛毛的博客 3956

变邻域搜索(VNS)原理梳理和应用细节-附求解VRPTW问题C++代码

文章目录1、简介-introduction2、VNS的基本机制2.1 变邻域下降方法-Variable Neighborhood Descent2.2基本变邻域搜索方法-Basic Variable Neighborhood Search2.3 终止准则3、VNS的拓展和混杂算法3.1 VNS的拓展3.2 变邻域分解搜索-Variable Neighborhood Decomposition Search3.3 偏变邻域搜索-Skewed VNS3.4 并行变邻域搜索-Parallel VNS4、VNS和其

dragon Fly的博客 6826

AD620单电源应变片测量电路分析

笔者最近在用AD620做应变片的压力检测电路,正好AD620的datasheet中有对于应变片压力测量的应用电路,参考该电路进行设计及实验后发现该电路存在些许问题,并对其进行了优化改进。本文纯属个人理解,供大家参考,欢迎批评指正。 AD620应用电路分析及优化 应用电路分析 AD620手册中原电路如下(加了部分标注以便分析): 该电路中,前半部分比较明显,为经典的AD620放大电路结构:四个应变...

拙诚电子工作室 1万+

《剑指Offer(第二版)》面试题17. 打印从1到最大的n位数

输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。 示例 1: 输入: n = 1 输出: [1,2,3,4,5,6,7,8,9] 说明: 用返回一个整数列表来代替打印 n 为正整数 class Solution: def printNumbers(self, n: int) -> List[i...

今晚打老虎 397

Qt c++ llama.cpp 运行 LLaMA-3-8B 中文对话机器人(多模态输入)

助手:

寒寒豆豆软件公司的博客 218

《剑指offer》练习-面试题17-打印从1到最大的n位数

题目:输入数字n,按顺序打印出从1到最大的n位十进制数。比如输入3,则打印出1、2、3一直到最大的3位数999。用字符串来解决大数问题。要记住number字符串是有保存数字的,每次只要在number[i]的基础上操作就可以了。package offer; import java.util.Scanner; public class Solution17 { public static vo...

sinat_34548226的博客 286

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

【剑指Offer】面试题17. 打印从1到最大的n位数

题目 输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。 示例 1: 输入: n = 1 输出: [1,2,3,4,5,6,7,8,9] 说明: 用返回一个整数列表来代替打印 n 为正整数 解题思路 1、针对本题的常规思路,利用pow函数,秒解 2、假设可能出现大数(本题不可能),转换为大数问题求解 ...

胡图图 262

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

【剑指offer】面试题17:打印从 1 到最大的 n 位数

题目:输入数字n,按顺序打印出从1最大的的n位数十进制数。比如输入3,则打印出1,2,3一直到最大的3位数即999。  1、跳进面试官的陷进 这个题目看起来很简单。我们看到这个问题后,最容易想到的办法是求出最大的n位数,然后用一个循环从1开始逐个打印。于是我们很容易写出下面的代码: public class Print1ToMaxOfNDigits { // 方法一:没有考虑...

Java学习 1715

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

剑指Offer(Python多种思路实现):打印从1到最大的n位数

剑指Offer(Python多种思路实现):打印从1到最大的n位数 面试17题: 题目:打印从1到最大的n位数 题:输入数字n,按顺序打印出从1到最大的n位十进制数,比如输入3,则打印出1、2、3一直到最大的3位数999. 解题思路一:可以把问题转换成数字排列问题,用递归让代码更简洁。 class Solution: def Print1ToMaxOfNDigits(self...

weixin_44151089的博客 1216

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

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

Onwaier的博客 600

剑指offer17. 打印从1到最大的n位数 P114

剑指offer17. 打印从1到最大的n位数 P114 题目:输入数字n,按顺序打印出从1最大的n位十进制数。比如输入3,则打印出1、2、3一直到最大的3位数即999。 1. 方法一: 用字符数组str倒着存储大数。每次大数自增1,如果溢出,表明打印完 // 此函数完成大数自增1的功能,并返回是否已经“溢出”(长度满足题目要求) bool Increment(char *str, int...

lonelyVM的博客 197

面试题17. 打印从1到最大的n位数

题目: 面试题17. 打印从1到最大的n位数 题解: 1. 题解一:暴力求解 使用Math.pow()方法。 2. 题解二:快速幂 快速幂方法,手工实现一次快速幂,替换Math.pow()方法。 代码: 1. 代码一:暴力求解 // 方法1:暴力求解 public static int[] printNumbers(int n) { int len = (int)Math.pow(10, n); int nums[] = new int[len - 1]; for(int i =

dev_zyx的博客 882

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

剑指 Offer 17. 打印从1到最大的n位数 - 力扣(LeetCode) class Solution { public: vector<int> printNumbers(int n) { vector<int> res; int val = pow(10, n); for(int i = 1; i < val; ++i){ res.push_back(i); }

zj 214

剑指 Offer(第2版)面试题 17:打印从 1 到最大的 n 位数

剑指 Offer(第2版)面试题 17:打印从 1 到最大的 n 位数

ProgramNovice的博客 694

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

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

TrueDei 1235

剑指offer面试题17(java版):打印从1到最大的n位数

welcome to my blog 剑指offer面试题17(java版):打印从1到最大的n位数 题目要求 输入数字n,按顺序打印出从1到最大的n位十进制数.比如输入3,则打印出1,2,3,…,999 思路 本题最大的难点在于n取非常大时,int, long 都不够用的时候, 得用string表示 (大数问题) 对字符串形式的数字加一时要考虑的细节较多, 具体见注释 打印时如何找出第一个非零...

littlehaes的博客 797

打印从1到最大的n位数

剑指offer 面试题17 打印从1到最大的n位数 题目: 输入数字,按顺序打印出1到最大的n位十进制数。比如输入3,则打印出1、2、3一直到最大的3位数999。 思路: 因为n可能会很大,所以不能直接求出最大值,然后for一遍。有两种方法可以解决:一、字符串模拟加法;二、递归 字符串模拟加法要注意的是到最大值需要是停下来,可以采用一个boolean变量。因为函数里的参数是数组,会改变数组里的值所...

ChildYH的博客 302

剑指Offer19--面试题17. 打印从1到最大的n位数

剑指Offer19--面试题17. 打印从1到最大的n位数题目描述方法一:简单for循环方法二:快速幂/大数加法(待学习) 题目描述 输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。 示例 1: 输入: n = 1 输出: [1,2,3,4,5,6,7,8,9] 说明: 用返回一个整数列表来代替打印 n 为正整数 方法...

zhangyunpeng0922的博客 200
上一篇: 剑指Offer(第二版)面试题14:剪绳子
下一篇: 剑指Offer(第二版)面试题18:删除链表的节点
xy_cpp
博客等级 码龄10年 119粉丝 84原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值