面试题17:打印1到最大的n位数
解题思路:
首先是一个大陷阱,n有多大?万一大到long long类型都盛不下,你要直接动手写,那写的再正确也是凉凉。
我们考虑到用字符来表示数字,然后把字符打印出来就行了。
书上巴拉巴拉说了一种很复杂的方法,代码量大也比较繁琐,感兴趣的去参考资料看就行了。
这里直接介绍第二种简单的方法,其实打印出从1最大的n位十进制数,实际就是每一位上都是0-9,
n位数字做全排列就好了,第0位选好递归去选下一位,直到选到第n-1位,退出递归。
还有一个问题就是打印字符串的时候,需要把全排列之后的前边的0给去掉,或者说不打印出来。
解决办法也不难,就是设置一个bool变量初值为false,当未找到第一个不为0的数字且当前数字不为0时置为true,
然后根据bool变量再打印后边的数字就好了。
c/c++:
//打印出从1到n位的最大数字
void Print1ToMaxOfNDigits_2(int n){
//参数校验
if (n == 0)
return; //用字符串表示数字
char* number = new char[n + 1];
number[n] = '\0'; //第0位设置为i,并使用递归向后推进
for (int i = 0; i < 10; ++i) {
number[0] = '0' + i;
Print1ToMaxOfNDigitsRecursively(number, n, 0);
} //释放内存并返回
delete[] number;
return;
} //将长度为length的字符数组number
//的从左往右数第index+1位设置为0-9
void Print1ToMaxOfNDigitsRecursively(char* number, int length, int index){
//推进到第n位,输出并结束
if (index == length - 1) {
PrintNumber(number);
return;
} //第index+1位置为i,并向后推进
for (int i = 0; i < 10; ++i) {
number[index + 1] = i + '0';
Print1ToMaxOfNDigitsRecursively(number, length, index + 1);
} return; } // 字符串number表示一个数字,数字有若干个0开头
// 打印出这个数字,并忽略开头的0
void PrintNumber(char* number){
//isBeginning表示是否已经开始不为0
bool isBeginning = false;
int length = strlen(number); //找到第1位不为0后再循环输出
for (int i = 0; i < length; ++i) {
if (!isBeginning&&number[i] != '0')
isBeginning = true; if (isBeginning)
printf("%c", number[i]);
}
printf("\t"); return;
}
参考资料:
面试题17:打印1到最大的n位数的更多相关文章
- 【剑指offer】面试题 17. 打印从 1 到最大的 n 位数
面试题 17. 打印从 1 到最大的 n 位数 题目描述 题目:输入数字 n,按顺序打印出从 1 最大的 n 位十进制数.比如输入 3,则打印出 1.2.3 一直到最大的 3 位数即 999. 解答过 ...
- 面试题12:打印1到最大的n位数
// 面试题12_打印1到最大的n位数.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> ...
- 剑指offer编程题Java实现——面试题12打印1到最大的n位数
题目:打印1到最大的n位数 输入数字n,按顺序打印输出从1到最大的n位十进制数,比如输入3,打印从1到999. 这道题考察的地方是如何表示大数问题.由于n是任意大的数组,如果n太大的话n位数就超过了l ...
- 《剑指offer》面试题17. 打印从1到最大的n位数
问题描述 输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数.比如输入 3,则打印出 1.2.3 一直到最大的 3 位数 999. 示例 1: 输入: n = 1 输出: [1,2,3,4,5 ...
- 面试题17.打印从1到最大的n位数
void print_n_number(int n){ if(n<=0){ cout<<"fuckyou"; return; } string s="1 ...
- 剑指Offer:面试题12——打印1到最大的n位数(java实现)
问题描述: 输入数字n,按顺序打印出从1到最大的n位十进制数,比如输入3,则打印出1,2,3一直到最大的3位数即999. 思路1:最简单的想法就是先找出最大的n位数,然后循环打印即可. public ...
- 《剑指offer》面试题12 打印1到最大的n位数 Java版
书中方法:这道题的一个陷阱在于不能用int或者long去存储你要打印的数,然后用打印函数打印,因为这个数可能会很大.如果加1后超出了最大的n位数,就不打印了.用最高位是否进位判断是否结束,打印的时候注 ...
- 剑指offer-面试题12.打印1到最大的n位数
题目:输入数字n,按照打印出从1最大的n位10进制数.比如3,则 打印出1.2.3一直到最大的3位数即999 1.你觉得如果面试会有这么简单的题,那 只能说明你---太天真. 2.n=3尚可,如果n= ...
- 【面试题012】打印1到最大的n位数
[面试题012]打印1到最大的n位数 大数问题 字符串中的每一个字符都是‘0’到‘9’之间的某一个字符,用来表示数字中的一位,因为数字最大是n位的,因此我们需要一个长度为n+1的字符串,字符串的最后 ...
随机推荐
- wampserver2 配置ssl 经过验证 可用
本文原地址 http://blog.csdn.net/taosst/article/details/2182966 http://forum.wampserver.com/read.php?2,329 ...
- java入门了解08
1.集合深入 (一)hashSet实现原理: 当我们添加一个元素,HashSet会计算出其Hash值,再根据hash值在哈希表中找出存储他的位置 有两种情况:a.如果算出的hash值在哈希表中位置没有 ...
- 【转】BNF和EBNF的含义与用法
[转]BNF和EBNF的含义与用法 BNF 和EBNF的含义与用法 1简介 关于本文 什么是BNF?工作原理 基本原理 一个实例 EBNF及其用途 ...
- 记录quick cocos2d-x3.2升级至cocos2d-x3.8
目前为止,quickcocos2d-x没有3.8版本,想用3.8又想用quick,所以只能自己升级了,自己先记录下,防止忘记. cocos2d-x3.8里面有quick framework,而simu ...
- 英语发音规则---发/i:/的字母及字母组合
英语发音规则---发/i:/的字母及字母组合 一.总结 一句话总结: 1.字母组合ee发/iː/? bee beef see agree week meeting feel sweet free be ...
- asp.net中关于《%=》《%#》《%》 的用法——(转帖)
1:在.aspx页面,<% %>标签相当于在.cs页面的代码,也就是说你在.cs文件里面怎样写,就可以在.aspx文件里面的<% %>标签里面怎样写. 2:在.aspx页面,& ...
- Web中常用字体介绍
1.在Web编码中,CSS默认应用的Web字体是有限的,虽然在新版本的CSS3,我们可以通过新增的@font-face属性来引入特殊的浏览器加载字体. 浏览器中展示网页文字内容时,文字字体都会按照设计 ...
- 一致性问题和Raft一致性算法——一致性问题是无法彻底解决的,可以说一个分布式系统可靠性达到99.99…%,但不能说它达到了100%
一致性问题 一致性算法是用来解决一致性问题的,那么什么是一致性问题呢? 在分布式系统中,一致性问题(consensus problem)是指对于一组服务器,给定一组操作,我们需要一个协议使得最后它们的 ...
- Javascript-- jQuery事件篇(2)
jQuery表单事件之blur与focus事件 单处理事件focusin事件与focusout事件,同样用于处理表单焦点的事件还有blur与focus事件 它们之间的本质区别: 是否支持冒泡处理 举个 ...
- android sqlite,大数据处理、同时读写
1. 批量写入,采用事物方式,先缓存数据,再批量写入数据,极大提高了速度 288条,直接inset into 耗时7秒 8640条, 批量写入 耗时5-7秒 try { this.myD ...