-
Notifications
You must be signed in to change notification settings - Fork 2
/
PrintMaxNumber.ts
89 lines (83 loc) · 2.36 KB
/
PrintMaxNumber.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
export default class PrintMaxNumber {
// 通过遍历获取最大值
public traverseForMax(n: number): void {
let maxNumber = 1;
let i = 0;
while (i++ < n) {
// 每次对结果*10,得出最小的n+1位的值
maxNumber *= 10;
}
// 输出1到最大值-1位置的值,就是n位数的最大值
for (let i = 1; i < maxNumber; i++) {
console.log(i);
}
}
// 通过字符串解法获取最大值
public maxNumberToStr(n: number): void {
if (n <= 0) return;
const numberStr: string[] = [];
// 控制数字最高位的排列(0 ~ 9)
for (let i = 0; i < 10; i++) {
numberStr[0] = i + "0";
this.printToMaxRecursively(numberStr, n, 0);
}
}
/**
* 递归获取最大值
* @param numStr 数字位数组
* @param length 数字位数
* @param index 当前位
* @private
*/
private printToMaxRecursively(
numStr: string[],
length: number,
index: number
): void {
if (index === length - 1) {
// 打印
PrintMaxNumber.printNumber(numStr);
return;
}
// 控制数字其他位的排列(0 ~ 9)
for (let i = 0; i < 10; i++) {
const nextIndex = index + 1;
numStr[nextIndex] = i + "0";
this.printToMaxRecursively(numStr, length, nextIndex);
}
}
/**
* 输出数字位数组中的有效数字
* @param numStr
* @private
*/
private static printNumber(numStr: string[]): void {
const nLength = numStr.length;
let remove0Val = "";
// 筛选除去多余0后的值
// 假设此时的值是3位数,那么对应的数组就为["00","00","10"], 数组每一项值的第0位才是我们需要的值
for (let i = 0; i < nLength; i++) {
const strVal = numStr[i];
// 取数组每一项的第0位
remove0Val += strVal[0];
}
let finalVal = "";
// 是否从0开始
let isBeginning0 = true;
// 筛选出第一个非0值的字符索引
for (let i = 0; i < remove0Val.length; i++) {
// 从0开始的状态为true且当前字符不为0
if (isBeginning0 && remove0Val[i] !== "0") {
// 表示我们已找到第一个非0数,修改状态
isBeginning0 = false;
}
// 当前位的数非0,将其存起来
if (!isBeginning0) {
finalVal += remove0Val[i];
}
}
if (finalVal !== "") {
console.log(finalVal);
}
}
}