剑指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 ...
随机推荐
- 关于柯尼卡美能达bizhub250出现c2557错误解决方法
打印机出现c2557代码的操作方法 1. 按效用/计数器键 英文是(Utility/Counter) 2. 看到有检查细息(Check Detail) 3. ...
- 一个基于MBProgressHUD的自定义视图hud例子
项目中用到的一个hud,基于MBProgressHUD,使用自定义视图实现的,动画效果是从网上参考的,并不是很理想.有需要的可以看看,这里是源码(源码用了cocoapods,运行前需要pod inst ...
- AMQ学习笔记 - 17. 事务的测试
概述 对事务机制进行测试. 测试实例 测试实例 结果预测 发送正常 3条消息入队 发送异常 0条消息入队 接收正常 3条消息出队 接收异常 0条消息出队 demo设计 设计图 测试分工 测试类 测试方 ...
- get the runing time of C++ console program.
// 获取程序运行时间.cpp : 定义控制台应用程序的入口点.// #include "stdafx.h"#include <time.h>#include < ...
- Arduino CNC Shiled 和 DRV8825驱动板的注意事项
首先说明硬件:1) Arduino CNC Shiled V2.6 2)DRV8825驱动板 3)光驱步进电机 4)Arduino uno R3 下图是本次主角是Arduino CNC Shile ...
- 一款jQuery打造的滚动条在底部滑出信息提示层
一款jQuery打造的滚动条在底部滑出信息提示层, 当滚动鼠标滚轮,或者滚动条往下拉的时候,在右下角,弹出一个信息提示框. 有一点仿的是一个插件工具,就是网页中大家都长用到的友荐. 这款特效算一款简单 ...
- 分享:linux下apache服务器的配置和管理
linux下apache服务器的配置和管理. 一.两个重要目录: Apache有两个重要的目录:1.配置目录/etc/httpd/conf:2.文档目录/var/www: 二.两种配置模式: Apac ...
- URL锚点HTML定位技术机制
一.锚点是什么 锚点就等同于火影中的“飞雷神之术”,我们先看百科中锚点的解释: 使用命名锚记可以在文档中设置标记,这些标记通常放在文档的特定主题处或顶部.然后可以创建到这些命名锚记的链接,这些链接可快 ...
- Global::validateEmail
/***************************************************************** (C) Copyright DENTSPLY Internatio ...
- Spark菜鸟学习营Day4 单元测试程序的编写
Spark菜鸟学习营Day4 单元测试程序的编写 Spark相比于传统代码是比较难以调试的,单元测试的编写是非常必要的. Step0:需求分析 在测试案例编写前,需完成需求分析工作,明确程序所有的输入 ...