外观
高频面试题
画星号
问题描述
实现一个函数,入参为数字 n,输出如下图所示的字符串。

解决方案
javascript
function drawAsterisk(n) {
function getRepeatStr(num, repeatStr) {
return new Array(num).fill(repeatStr).join("");
}
function log(str) {
console.log(str);
}
const arr = [];
const sumLength = 2 * n - 1;
for (let i = 0; i < n - 1; i++) {
const numOfStar = 2 * i + 1;
const numOfSpaces = sumLength - numOfStar;
const sideSpaces = getRepeatStr(numOfSpaces / 2, " ");
arr.push(sideSpaces + getRepeatStr(numOfStar, "*") + sideSpaces);
}
// 画上半部分
arr.forEach(log);
// 画中间一行
console.log(getRepeatStr(2 * n - 1, "*"));
// 下半部分与上半部分层是轴对称的,直接 `reverse()` 反转下就可以直接用
arr.reverse();
// 画下半部分
arr.forEach(log);
}
drawAsterisk(2);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
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
90度旋转二维数组
问题描述
javascript
const rawArr = [
["1", "2", "3", "4", "5"],
["6", "7", "8", "9", "a"],
["b", "c", "d", "e", "f"],
["g", "h", "i", "j", "k"],
["l", "m", "n", "o", "p"],
];1
2
3
4
5
6
7
2
3
4
5
6
7
修改 rawArr,使达到如下所示的 90 度旋转效果
json
[
["l", "g", "b", "6", "1"],
["m", "h", "c", "7", "2"],
["n", "i", "d", "8", "3"],
["o", "j", "e", "9", "4"],
["p", "k", "f", "a", "5"]
]1
2
3
4
5
6
7
2
3
4
5
6
7
解决方案
使用新数组再覆盖原数组
如果直接先生成一个新数组, 然后逐个将旧数组里的元素赋值到新数组中的对应位置,那就很简单了。
先列数据看规律:
- (0, 0) => (0, 4)
- (0, 1) => (1, 4)
- (0, 2) => (2, 4)
- (0, 3) => (3, 4)
- (0, 4) => (4, 4)
- ...
- (2, 0) => (0, 2)
- (2, 1) => (1, 2)
- (2, 2) => (2, 2)
- (2, 3) => (3, 2)
- (2, 4) => (4, 2)
- ...
- (4, 0) => (0, 0)
- (4, 1) => (1, 0)
- (4, 2) => (2, 0)
- (4, 3) => (3, 0)
- (4, 4) => (4, 0)
可以看出规律是:oldArray(x, y) => newArray(y, 5 - 1 - x)
javascript
const rawArr = [
["1", "2", "3", "4", "5"],
["6", "7", "8", "9", "a"],
["b", "c", "d", "e", "f"],
["g", "h", "i", "j", "k"],
["l", "m", "n", "o", "p"],
];
function rotate90(arr) {
const length = arr.length;
// 直接这样写是不行的,5个子数组实际对应的是同一个对象,修改一个其实是5个子数组里的值都变了
// const tempArr = new Array(length).fill(new Array(length))
// 这里去掉fill(1)的话就无法构造成二维数组了
const tempArr = new Array(5).fill(1).map(() => new Array(5));
arr.forEach((row, rowIdx) => {
row.forEach((col, colIdx) => {
tempArr[colIdx][length - rowIdx - 1] = arr[rowIdx][colIdx];
console.log(
`(${rowIdx}, ${colIdx}) => (${colIdx}, ${length - rowIdx - 1})`,
);
});
});
return tempArr;
}
console.log(rotate90(rawArr));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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25