打印从1到最大的n位数20210119

打印从1到最大的n位数*简单

题目

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

示例 1:

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

说明:

  • 用返回一个整数列表来代替打印
  • n 为正整数

解法

解法1:

定义max数组,表示n对应的最大数;根据最大数确定返回的int数组的大小,以及上界。

时间复杂度:O(10^n)
空间复杂度:O(n) 用户返回的空间不算

public int[] printNumbers(int n) {
    int[] max = new int[n];
    max[0] = 9;
    for (int i = 1; i < n; i++) {
        max[i] = (int)Math.pow(10,i)*9 + max[i-1];
    }
    int[] res = new int[max[n-1]];
    for (int j = 0; j < max[n-1]; ) {
        res[j] =++j;
    }
    return res;
}

解法2:

改变确定max数据的方式,直接获取最大值。减少空间上的消耗。

时间复杂度:O(10^n)
空间复杂度:O(1) 用户返回的空间不算

public int[] printNumbers(int n) {
    int max = (int)Math.pow(10,n);
    int[] res = new int[--max];
    int i = 0;
    while (i < max) {
        res[i] = ++i;
    }
    return res;
}

大数问题

由于本题规定输出的是int类型的数组,所以默认输出的数字都是int范围内,如果没有规定,那么就是一个很经典的大数问题。

关于这个题解,可以优先参考这里

public class Test7 {
	StringBuilder sBuilder = null;
	char[] num;
	char[] loop = {'0','1','2','3','4','5','6','7','8','9'};
	int start, count, nine;
	public String printNumbers(int n) {
		sBuilder = new StringBuilder();
		num = new char[n];
		start = n-1;
		dfs(0, n);
		sBuilder.deleteCharAt(sBuilder.length()-1);
		return sBuilder.toString();
	}
	void dfs(int x, int n) {
		if (x == n) {
			String str = String.valueOf(num).substring(start);
			if (!str.equals("0")) sBuilder.append(str + ",");
			if (n-start == nine) {
				start--;
			}
			return ;
		}
		for (char temp : loop) {
			if (temp == '9') nine++;
			num[x] = temp;
			dfs(x+1, n);
		}
		nine--;
	}
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值