面试题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;
}

参考资料:

剑指offer第二版面试题17

原文地址:https://www.cnblogs.com/BoqianLiu/p/9451538.html

时间: 2024-08-02 11:33:45

面试题17:打印1到最大的n位数的相关文章

LeetCode | 面试题17. 打印从1到最大的n位数【剑指Offer】【Python】

LeetCode 面试题17. 打印从1到最大的n位数[剑指Offer][Easy][Python][遍历] 问题 力扣 输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数.比如输入 3,则打印出 1.2.3 一直到最大的 3 位数 999. 示例 1: 输入: n = 1 输出: [1,2,3,4,5,6,7,8,9] 说明: 用返回一个整数列表来代替打印 n 为正整数 思路 Python3代码 class Solution: def printNumbers(self, n: int

面试题17:合并两个排序的链表

ListNode类(结点类) 1 package leetcode.utilities; 2 3 public class ListNode { 4 public int val ; 5 public ListNode next ; 6 public ListNode(int val) { 7 // TODO Auto-generated constructor stub 8 this.val = val; 9 this.next = null ; 10 } 11 //打印链表 12 publi

面试题 17:合并两个排序的链表

题目:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按 照递增排序的. 两个指针指向两个链表的头结点,取其中值小的作为新链表的头结点,和之前的结点串联,如此递归. 注意用例: 两个链表都为null: 其中一个链表为null: 两个链表有多个结点,有相同的值,不同的值. package offer; /*面试题 17:合并两个排序的链表 题目:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按 照递增排序的.*/ public class Problem17 { st

算法笔记_189:历届试题 横向打印二叉树(Java)

目录 1 问题描述 2 解决方案   1 问题描述 问题描述 二叉树可以用于排序.其原理很简单:对于一个排序二叉树添加新节点时,先与根节点比较,若小则交给左子树继续处理,否则交给右子树. 当遇到空子树时,则把该节点放入那个位置. 比如,10 8 5 7 12 4 的输入顺序,应该建成二叉树如下图所示,其中.表示空白. ...|-1210-|...|-8-|.......|...|-7.......|-5-|...........|-4 本题目要求:根据已知的数字,建立排序二叉树,并在标准输出中横

Sony笔试题 &mdash;&mdash;完成打印图案的程序

Sony笔试题  完成下列打印图案的程序:   *    *.*.    *..*..*..    *...*...*...*...    *....*....*....*....*....    *.....*.....*.....*.....*.....*.....    *......*......*......*......*......*......*......    *.......*.......*.......*.......*.......*.......*.......*.

《剑指offer》第十七题:打印1到最大的n位数

// 面试题17:打印1到最大的n位数 // 题目:输入数字n,按顺序打印出从1最大的n位十进制数.比如输入3,则 // 打印出1.2.3一直到最大的3位数即999. #include <cstdio> #include <memory> void PrintNumber(char* number); bool Increment(char* number); void Print1ToMaxOfNDigitsRecursively(char* number, int length

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

题目描述: 给定一个数字N,打印从1到最大的N位数 此题需要注意以下几点: 1. 涉及到大数问题,因为并没有限定 n的取值范围,所以需要采取 字符数组模拟大数运算 2. 打印数字时 需要忽略前置0 3. 我们始终 以n位数为整体,n位所有十进制数其实是 n位从0到9的全排列,可以采用递归解决 我们从 数组下标0开始 (对应于数字最高位),每一位都有0到9取值,然后设置下一位,递归的结束条件是 设置位到了数组的最末端 1 void PrintNum(char* num) 2 { 3 char* c

数据结构-打印1到最大的n位数

题目:输入数字n,按顺序打印出从1到最大的n位十进制数,比如输入3,则打印出1,2,3一直到最大的3位数即999. 分析:本题最关键的部分是当n值非常大的时候会超出数据类型的范围.偷个懒,没有实现打印1,2,3....999.可以利用分割把string分割成char[].然后单个的char转为int再进行加减法,作为输出. /* 剑指offer面试题12 该问题主要考虑到数据非常大超出数据类型的范围 */ #include <iostream> #include <cstring>

剑指OFFER之打印1到最大的N位数(九度OJ1515)

题目描述: 给定一个数字N,打印从1到最大的N位数. 输入: 每个输入文件仅包含一组测试样例.对于每个测试案例,输入一个数字N(1<=N<=5). 输出: 对应每个测试案例,依次打印从1到最大的N位数. 样例输入: 1 样例输出: 1 2 3 4 5 6 7 8 9 解题思路: 直接通过n快速指定比最大的那个数大1的数,10,100,1000,10000,100000.... 输出,就行了... 代码: #include <stdio.h> int main(void){ int