打印1到最大的n位数
2013-04-09 17:06
260 查看
题目:
输入数字n,按顺序打印出1到最大的n位十进制数。比如输入3,则打印出1、2、3一直到最大的3位数即999。方法1
//利用case语句使字符++ char CharPlus(char a) { char b; switch ( a ) { case '0': b = '1'; break; case '1': b = '2'; break; case '2': b = '3'; break; case '3': b = '4'; break; case '4': b = '5'; break; case '5': b = '6'; break; case '6': b = '7'; break; case '7': b = '8'; break; case '8': b = '9'; break; case '9': b = '0'; break; default: cout<<"error"<<endl; } return b; } bool Increment(char* numchar,int len) { bool flag = false; for (len = len-1; len >= 0; len-- ) { numchar[len] = CharPlus( numchar[len] ); //更新该位上的数字 if ( numchar[0] == '9' ) //用于判断越界情况处理 { flag = true; } if ( numchar[len] != '0' ) //判断是否向高位移动,如果该为由9->0,则向高位移动 { break; } if ( flag && numchar[0]=='0' ) //和上面的判断越界条件一起使用 { return false; } } return true; } //打印输出时,要符合一般习惯,把前面的0去掉 void PrintNum(char* numchar) { int i = 0; bool flag = false; while ( numchar[i] != '\0' ) { if (!flag && numchar[i] != '0' ) { flag = true; } if ( flag ) { cout<<numchar[i]; } i++; } cout<<endl; } void Print1ToMaxOfNDigits(int n) { if ( n <= 0 ) { cout<<n<<" is illegal"<<endl; return; } char * numchar = new char[n+1]; memset( numchar,'0',sizeof(char)*(n+1) ); numchar = '\0'; //先对字符串数组初始化 while ( Increment(numchar,n) ) //字符串数组++,如果已经是最大则返回false { PrintNum(numchar); //打印出该数字 } delete[] numchar; }
上述代码虽直观,但较长,要在面试短短几十分钟内写完整,确实有点难度。这锻炼了考生的耐心程度。一般面试时,写的代码都不会很长,大概50行左右。因此,我们可以换思路去考虑问题。
方法2
换思路,n位所有十进制数其实就是n个0-9的数全排列的过程,只是排在前面的0我们不打印出来。全排列可以用递归去写,递归结束条件是我们已经设置了数字的最后一位
void Print1ToMaxOfNDigitsRecursively(char* numchar, int length, int index) { if ( index == length -1) { PrintNum(numchar); return; } for ( int i = 0; i < 10; i++ ) { numchar[index+1] = i +'0'; Print1ToMaxOfNDigitsRecursively(numchar, length, index+1); } } void Print1ToMaxOfNDigits_o(int n) { if ( n <= 0 ) { cout<<n<<" is illegal"<<endl; return; } char * numchar = new char[n+1]; numchar = '\0'; //先对字符串数组初始化 for ( int i = 0; i < 10; i++ ) { numchar[0] = i + '0'; Print1ToMaxOfNDigitsRecursively(numchar,n,0); } delete[] numchar; }
测试用例
功能测试(输入1、2、3……)特殊输入测试(输入-1,0)。
考点:
考查解决大数问题的能力。时间空间复杂度尽可能好
能否用递归做
总结:
如果面试题是关于n位的整数并且没有限定n的取值范围,或者是输入任意大小的整数,那么这个题目很有可能是需要考虑大数问题。字符串是一个简单、有效的表示大数的方法。相关文章推荐
- 剑指Offer-12-打印1到最大的n位数
- 从1打印到N位数最大数 的全排列方法。Java
- 打印1到最大的n位数
- 打印1到最大的n位数
- 剑指offer面试题12 使用BigInteger来实现 打印1到最大的n位数
- 打印1到最大的n位数 12
- 打印1到最大的n位数 题目:输入数字n,按顺序打印出从1最大的n位十进制数。
- offer面试题----打印1到最大的n位数
- 【剑指offer系列】 打印1到最大的n位数___12
- 【算法详解】打印1到最大的n位数
- 剑指17_打印从1到最大的n位数(大数问题)
- 打印1到最大的n位数
- 打印1到最大的n位数
- 打印1到最大的n位数
- 剑指offer 面试题12—打印1到最大的n位数
- 剑指Offer面试题12打印1到最大的n位数,面试题13在O(1)时间删除链表结点
- Algorithm - 打印从0到最大的n位数
- 打印1到最大的n位数――12
- 打印出1到最大的n位数
- 题目1515:打印1到最大的N位数