题目:
输入数字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的取值范围,或者是输入任意大小的整数,那么这个题目很有可能是需要考虑大数问题。字符串是一个简单、有效的表示大数的方法。