剑指offer--面试题12
题目:打印从1~最大的n位数
分析:知道陷阱在哪,即n很大时若用通常的int,long会溢出;想到用字符串解决,这涉及到字符转数字及反过来。
刚开始纠结于字符串怎么加1,想了片刻,觉得应该取出最后一位上的字符,转成数字+1再转成字符,但这就出现个问题:'9'加1后得到'10',这会产生进位。。。
到这思维就乱了。。。1、不断向前进位怎么解决?2、怎么判断到达最大值?
在看过作者的代码后才豁然开朗。。。,解决方案:1、将进位与不进位分开,并且进位时设定nTakeOver用于下一字符的加,该过程用循环完成;2、同样判断最大值时,若第一位的数值=10了,那肯定已经到达最大值了
结合参考代码,自己所写代码如下:
#include "stdafx.h"
#include <iostream> using namespace std; void PrintNumber(char* number); //打印数字
bool Increment(char* number,int length); //加1 // ====================方法一====================
void Print1ToMaxOfNDigits_1(int n)
{
if(n <= )
return; //错误处理 char *number = new char[n + ];
memset(number, '', n); //memset()函数设置number的前n位为字符‘0’:memset(number,'0',n); 该函数位于<memory>
number[n] = '\0'; //注意字符串以‘/0’结尾!!! while(!Increment(number,n))
{
PrintNumber(number);
} //加1成功则打印 delete [] number;
} //实现加1操作
//一直到某位上的数值不超过9,终止循环
//利用循环向前进位
bool Increment(char* number, int length)
{
bool isOverFlow = false;
int nTakeOver = ;
for(int i=length-; i>=; i--)
{
//加1,要考虑之前的进位nTakeOver
int num_value = number[i] - '' + nTakeOver;
if(i == length-)
num_value += ;
if(num_value <= )
{
number[i] = num_value + '';
break;
}
else
{
//达到最大n位数后终止
if(i == )
isOverFlow = true;
else
{
nTakeOver = ;
number[i] = num_value - + '';
}
}
} return isOverFlow;
} //打印字符串表示的数字
void PrintNumber(char* number)
{
while(*number != '\0')
{
if(*number == '')
number++;
else
{
cout<<number<<'\t';
break;
}
}
} // ====================测试代码====================
void Test(int n)
{
printf("Test for %d begins:\n", n); Print1ToMaxOfNDigits_1(n); printf("Test for %d ends.\n", n);
} int main()
{
Test();
Test();
Test();
Test();
Test(-); return ;
}
说明:只是在PrintNumber子函数上做了些改进。
另一种思路:因为每位为0~9,共n位,所以数字个数=10^n-1,因此相当于全排列的方法,而全排列可用递归实现!
这种方法由于涉及到递归,所以自己很难想到,即便想到也很难写出来。。。
参考代码如下:
// ====================方法二====================
void Print1ToMaxOfNDigits_2(int n)
{
if(n <= )
return; char* number = new char[n + ];
number[n] = '\0'; for(int i = ; i < ; ++i)
{
number[] = i + '';
Print1ToMaxOfNDigitsRecursively(number, n, );
} delete[] number;
} void Print1ToMaxOfNDigitsRecursively(char* number, int length, int index)
{
if(index == length - )
{
PrintNumber(number);
return;
} for(int i = ; i < ; ++i)
{
number[index + ] = i + '';
Print1ToMaxOfNDigitsRecursively(number, length, index + );
}
}
简单明了!!!
PS:对全排列的递归实现,值得关注与记忆!!!
剑指offer--面试题12的更多相关文章
- 剑指Offer:面试题12——打印1到最大的n位数(java实现)
问题描述: 输入数字n,按顺序打印出从1到最大的n位十进制数,比如输入3,则打印出1,2,3一直到最大的3位数即999. 思路1:最简单的想法就是先找出最大的n位数,然后循环打印即可. public ...
- 【剑指offer 面试题12】打印1到最大的n位数
思路: 用n位字符数组表示n位数,通过递归的方式逐层(位)遍历,递归终止时打印. #include "stdio.h" #include "string.h" ...
- 剑指Offer——笔试题+知识点总结
剑指Offer--笔试题+知识点总结 情景回顾 时间:2016.9.23 12:00-14:00 19:00-21:00 地点:山东省网络环境智能计算技术重点实验室 事件:笔试 注意事项:要有大局观, ...
- C++版 - 剑指Offer 面试题39:二叉树的深度(高度)(二叉树深度优先遍历dfs的应用) 题解
剑指Offer 面试题39:二叉树的深度(高度) 题目:输入一棵二叉树的根结点,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度.例如:输入二叉树 ...
- C++版 - 剑指Offer 面试题45:圆圈中最后剩下的数字(约瑟夫环问题,ZOJ 1088:System Overload类似)题解
剑指Offer 面试题45:圆圈中最后剩下的数字(约瑟夫环问题) 原书题目:0, 1, - , n-1 这n个数字排成一个圈圈,从数字0开始每次从圆圏里删除第m个数字.求出这个圈圈里剩下的最后一个数字 ...
- 【剑指Offer面试题】 九度OJ1368:二叉树中和为某一值的路径
题目链接地址: http://ac.jobdu.com/problem.php? pid=1368 题目1368:二叉树中和为某一值的路径 时间限制:1 秒内存限制:32 兆特殊判题:否提交:2252 ...
- 【剑指Offer面试题】九度OJ1384:二维数组中的查找
下决心AC全部剑指offer面试题. 九度OJ面试题地址:http://ac.jobdu.com/hhtproblems.php 书籍:何海涛--<剑指Offer:名企面试官精讲典型编程题> ...
- 剑指Offer:面试题15——链表中倒数第k个结点(java实现)
问题描述 输入一个链表,输出该链表中倒数第k个结点.(尾结点是倒数第一个) 结点定义如下: public class ListNode { int val; ListNode next = null; ...
- 剑指offer面试题3 二维数组中的查找(c)
剑指offer面试题三:
- C++版 - 剑指offer之面试题37:两个链表的第一个公共结点[LeetCode 160] 解题报告
剑指offer之面试题37 两个链表的第一个公共结点 提交网址: http://www.nowcoder.com/practice/6ab1d9a29e88450685099d45c9e31e46?t ...
随机推荐
- C# lock用法
当我们使用线程的时候,效率最高的方式当然是异步,即各个线程同时运行,其间不相互依赖和等待.但当不同的线程都需要访问某个资源的时候,就需要同步机制了,也就是说当对同一个资源进行读写的时候,我们要使该资源 ...
- sql with as用法详解
一.WITH AS的含义 WITH AS短语,也叫做子查询部分(subquery factoring),可以让你做很多事情,定义一个SQL片断,该SQL片断会被整个SQL语句所用到.有的时候,是为了让 ...
- 【转】C#异步编程及其同步机制
C#异步编程及其同步机制 本篇文章涵盖一下几部分内容: 1. 什么是异步编程,为什么会需要异步编程 2. .NET下的异步编程及其发展 3. .NET线程同步机制及线程间数据封送 4. 异步模式 5. ...
- 微信公众号与HTML 5混合模式揭秘2——分享手机相册中照片
本书是分享微信jssdk开发的第二篇. 4.2.1 项目需求 需求说明:实现微信端的手机用户,点击按钮选取1张图片,分享到朋友圈. 4.2.2 需求分解 通过对需求的了解,可以将其分解为: ( ...
- 分享10款功能强大的HTML5/CSS3应用插件
1.纯CSS3美化Checkbox和Radiobox按钮 外观很时尚 利用CSS3我们可以打造非常具有个性化的用户表单,今天我们就利用CSS3美化Checkbox复选框和Radiobox单选框.CSS ...
- 让apache与mysql随着系统自动启动
让apache与mysql随着系统自动启动 在Linux中有一个文件/etc/rc.d/rc.local文件,其系统在启动时会自动加载该文件,我们可以把要启动的服务放入这个文件中即可. 添加以下代码:
- Linux概述
Linux概述 1.计算机资源 硬件资源 软件资源 硬件资源与软件资源之间的桥梁就是操作系统 2.操作系统分类 Windows :个人版用户最多 Mac :土豪机 Linux :主要应用于服务器 Un ...
- 超越luabind的luaBridge
此编是引用他人的文章,这里记录下,主要为以后自己查找方便,原文地址:http://www.cppblog.com/sunicdavy/archive/2013/12/07/204648.html 最近 ...
- spring MVC项目中,欢迎页首页根路径到底是怎么设置的
0. 问题: 如何改mvc中项目的欢迎页,或者叫做根路径 一个东西快弄完了,就剩下一个问题,应该是个小问题.就是mvc项目的欢迎页,怎么给改下呢. 这个项目是通过mvn建立的,整个项目的原型就是spr ...
- ADO.NET笔记——调用存储过程
相关知识: 在ADO.NET访问SQL Server时,鼓励使用存储过程取代常规的SQL语句. 存储过程有下列优点: 存储过程中的SQL语句将会经过预先的解析和编译,然后存放在数据库服务器上行.调用的 ...