Appearance
17-打印从1到最大的n位数
题目描述
https://leetcode.cn/problems/da-yin-cong-1dao-zui-da-de-nwei-shu-lcof
输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。
示例 1:
输入: n = 1
输出: [1,2,3,4,5,6,7,8,9]
说明:
用返回一个整数列表来代替打印 n 为正整数
思路分析
n表示位数,题目返回的是 int 数组,我们假设它不会越界 那么最大的值就是 n 个 9 组成的数值,我们一次将它加入数组返回
实现代码
csharp
public class Solution {
public int[] PrintNumbers(int n) {
if(n<1){
return new int[]{};
}
string s = "";
for(int i=0; i<n; i++){
s+="9";
}
int end = Convert.ToInt32(s);
List<int> arr = new List<int>();
for(int i=1; i<=end; i++){
arr.Add(i);
}
return arr.ToArray();
}
}
思路分析:大数问题
LeetCode 因为返回值的问题,没有考虑大数,本题的原本目的是为了考虑大数问题,即字符串最终的数值可能超过 int/long 等类型的最大值
java
class Solution {
StringBuilder res;
int nine = 0, count = 0, start, n;
char[] num, loop = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
public String printNumbers(int n) {
this.n = n;
res = new StringBuilder();
num = new char[n];
start = n - 1;
dfs(0);
res.deleteCharAt(res.length() - 1);
return res.toString();
}
void dfs(int x) {
if(x == n) {
String s = String.valueOf(num).substring(start);
if(!s.equals("0")) res.append(s + ",");
if(n - start == nine) start--;
return;
}
for(char i : loop) {
if(i == '9') nine++;
num[x] = i;
dfs(x + 1);
}
nine--;
}
}
复习:20220611
csharp
public class Solution {
private List<int> list;
private void dfs(int n, StringBuilder sb){
if(n == 0){
//输出;
int num = Convert.ToInt32(sb.ToString());
if(num > 0){
list.Add(num);
}
return;
}
for(int i=0; i<=9; i++){
sb.Append(i.ToString());
dfs(n-1,sb);
sb.Length--;
}
}
public int[] PrintNumbers(int n) {
list = new List<int>();
StringBuilder sb = new StringBuilder();
dfs(n,sb);
return list.ToArray();
}
}
AlgoPress