《剑指Offer——打印1到最大的n位数》代码

Posted 穿迷彩服的鲨鱼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《剑指Offer——打印1到最大的n位数》代码相关的知识,希望对你有一定的参考价值。


前言

//==================================================================
// 《剑指Offer——打印1到最大的n位数》代码
// 题目:输入数字n,按顺序打印出从1最大的n位十进制数。比如输入3,则
// 打印出1、2、3一直到最大的3位数即999。
//==================================================================


一、示例

1.打印1到最大的n位数

/*========================================================
输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。
比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。

示例 1:
输入: n = 1
输出: [1,2,3,4,5,6,7,8,9]
=======================================================*/

二、代码解析

1.新建.cpp文件

代码如下(示例):

//==================================================================
// 《剑指Offer——打印1到最大的n位数》代码
// 题目:输入数字n,按顺序打印出从1最大的n位十进制数。比如输入3,则
// 打印出1、2、3一直到最大的3位数即999。
//==================================================================



#include <iostream>
#include<vector>
using namespace std;

/*========================================================
输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。
比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。

示例 1:
输入: n = 1
输出: [1,2,3,4,5,6,7,8,9]
=======================================================*/
/*====================方法一--暴力====================*/
vector<int> printNumbers(int n)
{
	if (n < 1)return {};
	int len = pow(10, n) - 1;
	vector<int> result(len, 0);
	for (int i = 0; i < len; ++i)
	{
		result[i] = i + 1;
	}
	return result;
}

/*====================方法二--在字符串上模拟数字加法的解法====================*/
vector<int> result;
void PrintNumber(char* number)
{
	bool isBegining0 = true;
	int nLength = strlen(number);
	int res = 0;
	for (int i = 0; i < nLength; ++i)
	{
		if (isBegining0 && number[i] != '0')
		{
			isBegining0 = false;
		}
		if (!isBegining0)
		{
			printf("%c", number[i]);
			res = res * 10 + (number[i] - '0');
		}
	}
	result.push_back(res);
	printf("\\t");
}
bool Increment(char* number)
{
	bool isOverflow = false;
	int nTakeOver = 0;
	int nLength = strlen(number);

	for (int i = nLength - 1; i >= 0; --i)
	{
		int nSum = number[i] - '0' + nTakeOver;
		if (i == nLength - 1)
		{
			nSum++;
		}
		if (nSum >= 10)
		{
			if (i == 0)
			{
				isOverflow = true;
			}
			else
			{
				nSum -= 10;
				nTakeOver = 1;
				number[i] = '0' + nSum;
			}
		}
		else
		{
			number[i] = '0' + nSum;
			break;
		}
	}
	return isOverflow;
}
vector<int> Print1ToMaxOfNDigits_1(int n)
{
	if (n < 1)return{};
	char* number = new char[n + 1];
	memset(number, '0', n);
	number[n] = '\\0';
	while (!Increment(number))
	{
		PrintNumber(number);
	}
	delete[]number;
	return result;
}
/*====================方法三--数字排列====================*/
void Print1ToMaxOfNDigitsRecursively(char* number, int length, int index)
{
	if (index == length - 1)
	{
		PrintNumber(number);
		return;
	}

	for (int i = 0; i < 10; ++i)
	{
		number[index + 1] = i + '0';
		Print1ToMaxOfNDigitsRecursively(number, length, index + 1);
	}
}
vector<int> Print1ToMaxOfNDigits_2(int n)
{
	if (n < 1) return{};
	char* number = new char[n + 1];
	number[n] = '\\0';
	for (int i = 0; i < 10; ++i)
	{
		number[0] = i + '0';
		Print1ToMaxOfNDigitsRecursively(number, n, 0);
	}
	delete[] number;
	return result;
}

int main()
{
	
	return 0;
}

三,测试

以上是关于《剑指Offer——打印1到最大的n位数》代码的主要内容,如果未能解决你的问题,请参考以下文章

剑指Offer-打印从 1 到最大的 n 位数

Java 剑指offer(16) 打印1到最大的n位数

LeetCode——剑指offer17打印从1到最大的n位数

LeetCode剑指 Offer 17. 打印从1到最大的n位数(C++)

剑指 Offer 17. 打印从1到最大的n位数

剑指Offer之打印从1到最大的n位数