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

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

  • 剑指 Offer(第2版)面试题 17:打印从 1 到最大的 n 位数
    • 解法1:字符数组
    • 解法2:全排列

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

题目描述:

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

首先想到的是 for 循环挨个输出,但是这样的话会有 n 过大,位数过高而造成溢出的情况。

解法1:字符数组

我们使用字符串来模拟数字,这样的话不管多少位我们都可以解决:

构造字符数组:先构造一个 n 位,每一位都为 ‘0’ 的数组,每次最后一位 +1,重复这一过程到溢出为此(如 2 位,加到 100 就会溢出,因此输出 1 ~ 99)

输出:前面有 ‘0’ 的话不输出(如 “001”,应输出 “1”)

代码:

#include <iostream>
#include <string.h>
using namespace std;void print_number(int number);
void print_arr(char *arr);
bool over(char *arr);int main()
{print_number(2);system("pause");return 0;
}void print_number(int number)
{char *arr = new char[number + 1];memset(arr, '0', number);arr[number] = '\0';while (!over(arr)){print_arr(arr);}
}void print_arr(char *arr)
{ // 输出字符数组,第一个为0的话不输出bool start = false;int count = 0;while (!start){if (arr[count] != '0')start = true;count++;}for (int i = count - 1; i <= strlen(arr); i++)cout << arr[i];cout << "\t";
}bool over(char *arr)
{ // 数字加1操作arr[strlen(arr) - 1]++;int tmp = 0;for (int i = strlen(arr) - 1; i >= 0; i--){ // 进1相加arr[i] += tmp;if (arr[i] - '0' > 9){arr[i] = '0';tmp = 1;}else{tmp = 0;}}if (arr[0] == '0' && tmp == 1)return true; // 判断溢出return false;
}

复杂度分析:

时间复杂度:O(2n-1)。

空间复杂度:O(n),用到了一个长度为 n+1 的字符数组。

解法2:全排列

同样基于字符数组,每一位的数字都是从0 ~9 之间不断变化,因此其是一个排列的问题,我们可以使用递归实现数组的排列,输出的规则同解法 1。

代码:

#include <iostream>
#include <string.h>
using namespace std;void print_number(int number);
void print_arr(char *arr);
void permutation(char *arr, int index);int main()
{print_number(2);system("pause");return 0;
}void print_number(int number)
{char *arr = new char[number + 1];memset(arr, '0', number);arr[number] = '\0';for (int i = 0; i < 10; i++){arr[0] = i + '0';permutation(arr, 0);}
}
void permutation(char *arr, int index)
{ // 先递归凑足n位,然后排列输出if (index == strlen(arr) - 1){print_arr(arr);return;}for (int i = 0; i < 10; i++){arr[index + 1] = i + '0';permutation(arr, index + 1);}
}
void print_arr(char *arr)
{ // 输出字符数组,第一个为0的话不输出bool start = false;int count = 0;while (!start){if (arr[count] != '0')start = true;count++;}for (int i = count - 1; i <= strlen(arr); i++)cout << arr[i];cout << "\t";
}

复杂度分析:

时间复杂度:O(2n-1)。

空间复杂度:O(n),递归的深度为 n。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/197837.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端实现token无感刷新的原因和步骤

前端实现无感刷新 需要这么做的原因 在使用过程中&#xff0c;如果token过期&#xff0c;再操作页面可能就需要重新返回登录页获取token了&#xff0c;在持续使用的过程中可能会出现多次跳去登录页的情况&#xff0c;用户体验很不好。所以需要做无感刷新 做token无感刷新的方…

windows下ffmpeg源码编译

参考&#xff1a;windows上使用vs2019和msys64编译 ffmpeg 4.3 | 码农家园 (codenong.com) 安装命令&#xff1a; pacman -S nasm pacman -S yasm pacman -S make pacman -S cmake pacman -S diffutils pacman -S pkg-config pacman -S git 1.编译 x264 将 x264放到home文件下…

mfc 设置excel 单元格的列宽

CString strTL, strBR;strTL.Format(L"%s%d", GetExcelColName(cd.nCol), cd.nRow);strBR strTL;CRange rangeMerge range.get_Range(_variant_t(strTL), _variant_t(strBR));rangeMerge.put_ColumnWidth(_variant_t((long)(20))); 宽度设置函数为 &#xff1a; pu…

CSS新手入门笔记整理:CSS背景样式

背景颜色&#xff1a;background-color 语法 background-color:颜色值; 颜色值有两种 一种是“关键字”&#xff0c;指的是颜色的英文名称&#xff0c;如red、green、blue等。参考CSS 颜色名称。另外一种是“十六进制RGB值”&#xff0c;类似“#FBE9D0”形式的值。参考十六…

HT78621 3.5A开关限流降压变换器基本参数信息

HT78621是一款高压降压开关稳压器&#xff0c;可向负载提供高达2A的连续电流。 HT78621 特性&#xff1a; ・宽输入电压: 5V – 60V ・峰值开关电流限值典型3.5A ・Z高1MHz开关频率 ・支持PWM调光控制输入&#xff0c;应用于LED ・集成G端MOSFET的短路保护 ・200μA静态电…

CentOS7 防火墙常用命令

以下是在 CentOS 7 上使用 firewall-cmd 命令管理防火墙时的一些常用命令&#xff1a; 检查防火墙状态&#xff1a; sudo firewall-cmd --state 启动防火墙&#xff1a; sudo systemctl start firewalld 停止防火墙&#xff1a; sudo systemctl stop firewalld 重启防火墙&…

启动 AWS Academy Learner Lab【教学】(Hadoop实验)

&#x1f525;博客主页&#xff1a; A_SHOWY&#x1f3a5;系列专栏&#xff1a;力扣刷题总结录 数据结构 云计算 第一部分 创建实例过程 首先&#xff0c;需要创建3台EC2&#xff0c;一台作主节点 (master node)&#xff0c;两台作从节点 (slaves node)。 1.镜像选择 EC2&…

如何基于Akamai IoT边缘平台打造一个无服务器的位置分享应用

与地理位置有关的应用相信大家都很熟悉了&#xff0c;无论是IM软件里的位置共享或是电商、外卖应用中的配送地址匹配&#xff0c;我们几乎每天都在使用类似的功能与服务。不过你有没有想过&#xff0c;如何在自己开发的应用中嵌入类似的功能&#xff1f; 本文Akamai将为大家提…

梯度上升和随机梯度上升

目录 梯度上升算法&#xff1a; 代码&#xff1a; 随机梯度上升算法&#xff1a; 代码&#xff1a; 实验&#xff1a; 做图代码&#xff1a; 疑问&#xff1a; 1.梯度上升算法不适应大的数据集&#xff0c;改用随机梯度上升更合适。 2.改进过的随机梯度算法&#xff0…

Android Edittext进阶版(Textfieids)

一、Text fieids 允许用户在 UI 中输入文本&#xff0c;TextInputLayout TextInputEditText。 在 Text fieids 没出来(我不知道)前&#xff0c;想实现这个功能就需要自己自定义控件来实现这个功能。 几年前做个上面这种样式(filled 填充型)。需要多个控件组合 动画才能实现&a…

游戏开发增笑-扣扣死-Editor的脚本属性自定义定制-还写的挺详细的,旧版本反而更好

2012年在官方论坛注册的一个号&#xff0c;居然被禁言了&#xff0c;不知道官方现在是什么辣鸡&#xff0c;算了&#xff0c;大人不记狗子过 ”后来提交问题给CEO了&#xff0c;结果CEO百忙之中居然回复了&#xff0c;也是很低调的一个人&#xff0c;毕竟做技术的有什么坏心思呢…

基于SSM的老年公寓信息管理的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

Clickhouse遇到密码错误如何修改密码

输入错误密码报错 rootDAILACHDBUD001:/var/log# clickhouse-client ClickHouse client version 23.4.2.11 (official build). Connecting to localhost:9000 as user default. Password for user (default): Connecting to localhost:9000 as user default. Code: 516. DB::E…

2023年JetBrains开发调查:Java 8仍广泛使用

开发者生态系统调查是查找和分析实际情况的好方法&#xff0c;而实际情况通常与看似流行或趋势的情况相反。 排名前三&#xff1a; Java8采用率&#xff1a;50%Java17采用率&#xff1a;45%Java11采用率&#xff1a;38% 看到这么多人仍在使用 Java 8&#xff08;及更早版本&…

如何使用cpolar内网穿透工具实现公网SSH远程访问Deepin

文章目录 前言1. 开启SSH服务2. Deppin安装Cpolar3. 配置ssh公网地址4. 公网远程SSH连接5. 固定连接SSH公网地址6. SSH固定地址连接测试 前言 Deepin操作系统是一个基于Debian的Linux操作系统&#xff0c;专注于使用者对日常办公、学习、生活和娱乐的操作体验的极致&#xff0…

【C语言】深入理解指针(1)

目录 前言 &#xff08;一&#xff09;内存与地址 从实际生活出发 地址 内存 内存与地址关系密切 &#xff08;二&#xff09;指针变量 指针变量与取地址操作符 指针变量与解引用操作符 指针的大小 指针的运算 指针 - 整数 指针-指针 指针的关系运算 指针的类型的…

C++ 数组

目录 一维数组 一维数组的创建 一维数组的初始化 一维数组的使用 一维数组在内存中的存储 二维数组 二维数组的创建 二维数组的初始化 二维数组的使用 二维数组在内存中的存储 数组越界 一维数组 数组是一组形同类型的集合。 一维数组的创建 数组的创建方式&…

❀dialog命令运用于linux❀

目录 ❀dialog命令运用于linux❀ msgbox部件&#xff08;消息框&#xff09; yesno部件&#xff08;yesno框&#xff09; inputbox部件&#xff08;输入文本框&#xff09; textbox部件&#xff08;文本框&#xff09; menu部件&#xff08;菜单框&#xff09; fselect部…

哈希与哈希表

哈希表的概念 哈希表又名散列表&#xff0c;官话一点讲就是&#xff1a; 散列表&#xff08;Hash table&#xff0c;也叫哈希表&#xff09;&#xff0c;是根据关键码值(Key value)而直接进行访问的数据结构。也就是说&#xff0c;它通过把关键码值映射到表中一个位置来访问记…

SpringBoot集成Redis

引入依赖 建议使用 Lettuce 连接驱动 <!--一&#xff1a;Jedis连接驱动缺点&#xff1a;Jedis基于TCP的阻塞性的连接方式1. 阻塞性IO2. 不能异步3. 线程不安全的Lettuce连接驱动优点&#xff1a;Lettuce基于Netty的多路复用的异步非阻塞的连接方式&#xff0c;1. 线程安全2…