题目:
输入数字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[n] = '\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[n] = '\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的取值范围,或者是输入任意大小的整数,那么这个题目很有可能是需要考虑大数问题。字符串是一个简单、有效的表示大数的方法。
原文地址:点击打开链接