面试题17:打印1到最大的n位数

// 面试题17:打印1到最大的n位数
// 题目:输入数字n,按顺序打印出从1最大的n位十进制数。比如输入3,则
// 打印出1、2、3一直到最大的3位数即999。

解题思路:

首先是一个大陷阱,n有多大?万一大到long long类型都盛不下,你要直接动手写,那写的再正确也是凉凉。

我们考虑到用字符来表示数字,然后把字符打印出来就行了。

书上巴拉巴拉说了一种很复杂的方法,代码量大也比较繁琐,感兴趣的去参考资料看就行了。

这里直接介绍第二种简单的方法,其实打印出从1最大的n位十进制数,实际就是每一位上都是0-9,

n位数字做全排列就好了,第0位选好递归去选下一位,直到选到第n-1位,退出递归。

还有一个问题就是打印字符串的时候,需要把全排列之后的前边的0给去掉,或者说不打印出来。

解决办法也不难,就是设置一个bool变量初值为false,当未找到第一个不为0的数字且当前数字不为0时置为true,

然后根据bool变量再打印后边的数字就好了。

c/c++:

//打印出从1到n位的最大数字
void Print1ToMaxOfNDigits_2(int n){
	//参数校验
	if (n == 0)
		return;

	//用字符串表示数字
	char* number = new char[n + 1];
	number[n] = '\0';

	//第0位设置为i,并使用递归向后推进
	for (int i = 0; i < 10; ++i) {
		number[0] = '0' + i;
		Print1ToMaxOfNDigitsRecursively(number, n, 0);
	}

	//释放内存并返回
	delete[] number;
	return;
}

//将长度为length的字符数组number
//的从左往右数第index+1位设置为0-9
void Print1ToMaxOfNDigitsRecursively(char* number, int length, int index){
	//推进到第n位,输出并结束
	if (index == length - 1) {
		PrintNumber(number);
		return;
	}

	//第index+1位置为i,并向后推进
	for (int i = 0; i < 10; ++i) {
		number[index + 1] = i + '0';
		Print1ToMaxOfNDigitsRecursively(number, length, index + 1);
	}

	return;


}

// 字符串number表示一个数字,数字有若干个0开头
// 打印出这个数字,并忽略开头的0
void PrintNumber(char* number){
	//isBeginning表示是否已经开始不为0
	bool isBeginning = false;
	int length = strlen(number);

	//找到第1位不为0后再循环输出
	for (int i = 0; i < length; ++i) {
		if (!isBeginning&&number[i] != '0') 
			isBeginning = true;

		if (isBeginning)
			printf("%c", number[i]);
	}
	printf("\t");
	
	return;
}

参考资料:

posted @ 2018-08-09 20:20  朕蹲厕唱忐忑  阅读(220)  评论(0编辑  收藏  举报