其他分享
首页 > 其他分享> > 剑指Offer第12题(打印1到最大的n位数)

剑指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