剑指Offer第12题(打印1到最大的n位数)
作者:互联网
(本博客旨在个人总结回顾)
题目描述:
输入数字n,按顺序打印出从1到最大的n位十进制数。比如输入3,则打印1、2、3一直到最大的3位数即999。
解题思路:
看似特别简单的题目,越是面试官挖坑给你跳。因为题目的解法真的特别简单,根本就没有面试的需要。
一般这样看似简单的问题,但没有规定数字范围,往往就是考大数问题,大数问题一般可用字符解决。
解法一:(使用字符串模拟加法)
#include "stdafx.h"
#include <iostream>
using namespace std;
/*
* @name IncrementStr
* @brief 以字符串表示的数字加1(字符串逆序存放数字)
* @return bool
*/
bool IncrementStr(char* strNumber, int n)
{
if (NULL == strNumber)
{
return false;
}
int nLength = n;
int nIndex = 0;
bool bNextAddOne = true;//下一位是否加1
while (bNextAddOne)
{
if (strNumber[nIndex] == '9')
{
strNumber[nIndex] = '0';
bNextAddOne = true;
nIndex++;
if (nIndex >= nLength)
{
return false;
}
}
else if (strNumber[nIndex] < '9' && strNumber[nIndex] >= '0')
{
strNumber[nIndex] += 1;
bNextAddOne = false;
}
else
{
strNumber[nIndex] = '1';
bNextAddOne = false;
}
}
return true;
}
/*
* @name PrintReverseStr
* @brief 反向打印字符串
* @param [in] const char * const str
* @return void
*/
void PrintReverseStr(const char* const str)
{
if (NULL == str)
{
return;
}
int nLength = strlen(str) - 1;
while (nLength >= 0)
{
cout << str[nLength];
nLength--;
}
cout << endl;
}
/*
* @name PrintMaxOfNDigits
* @brief 从1打印到最大n位数。
* @param [in] int n
* @return bool
*/
bool PrintMaxOfNDigits(int n)
{
if (n <= 0)
{
return false;
}
char *strNumber = new char[n+1];
memset(strNumber, '\0', n + 1);
while (IncrementStr(strNumber, n))
{
PrintReverseStr(strNumber);
}
return true;
}
int _tmain(int argc, _TCHAR* argv[])
{
//测试用例-1, 0, 1, 3, 5
//PrintMaxOfNDigits(-1);
//PrintMaxOfNDigits(0);
//PrintMaxOfNDigits(1);
PrintMaxOfNDigits(3);
//PrintMaxOfNDigits(5);
system("pause");
return 0;
}
运行结果:
解法二:(递归实现数字排列)
#include "stdafx.h"
#include <iostream>
using namespace std;
/*
* @name PrintRecursion
* @brief 递归输出0~9的n位数全排列
* @param [in] char * strNumber 存放排列结果
* @param [in] int nIndex 当前修改位数
* @param [in] int n n位数
* @return void
*/
void PrintRecursion(char* strNumber, int nIndex, int n)
{
if (nIndex == n)
{
PrintStrNumber(strNumber);
return;
}
for (int i = 0; i < 10; i++)
{
strNumber[nIndex] = i + '0';
PrintRecursion(strNumber, nIndex+1, n);
}
}
/*
* @name PrintMaxOfNDigits
* @brief 从1打印到最大n位数。(递归实现)
* @param [in] int n
* @return bool
*/
bool PrintMaxOfNDigitsRecursion(int n)
{
if (n <= 0)
{
return false;
}
char *strNumber = new char[n + 1];
memset(strNumber, '0', n);
strNumber[n] = '\0';
PrintRecursion(strNumber, 0, n);
delete[] strNumber;
return true;
}
int _tmain(int argc, _TCHAR* argv[])
{
//测试用例-1, 0, 1, 3, 5
//PrintMaxOfNDigitsRecursion(-1);
//PrintMaxOfNDigitsRecursion(0);
//PrintMaxOfNDigitsRecursion(1);
PrintMaxOfNDigitsRecursion(3);
//PrintMaxOfNDigitsRecursion(5);
system("pause");
return 0;
}
运行结果:
标签:12,return,Offer,int,char,strNumber,位数,bNextAddOne,nIndex 来源: https://blog.csdn.net/qq_23903863/article/details/103223927