这是一个我无法弄清楚的面试问题..
将以下输出打印到JavaScript控制台(或您使用的任何控制台)
我解决这个问题的尝试是建立一个恒星阵列和一系列空间。
然后逐行打印每一行,通过添加星星或将星号更改为空格来修改它。
但这并不构成整个螺旋。它只构建了上半部分,所以我想知道是否有更优雅的解决方案?
感觉某种递归函数对此有好处吗?
new RegExp('mystring:.+\|').test('mystring:something|')
编辑:我尝试递归解决方案。我非常接近,但它仍然有点hacky: https://jsfiddle.net/6fa9uty3/
var starLine = [];
var spaceLine = [];
for (var i = 0; i < 33; i++) {
starLine.push('*');
spaceLine.push(' ');
}
console.log(starLine.join(' '));
for (var i = 1; i <= 32/2; i+=2) {
spaceLine[(i-1)] = '*';
spaceLine[32-(i-1)] = '*';
starLine[i] = ' ';
starLine[32-(i)] = ' ';
console.log(spaceLine.join(' '));
console.log(starLine.join(' '));
}
答案 0 :(得分:1)
解决方案:https://jsfiddle.net/oc5b5qzh/ - 在浏览器中查看控制台窗口以查看螺旋。
保持大小奇怪。我为每种情况使用了不同的字母代替*,这样你就可以看到循环的哪个部分解决了这种情况。显然可以进行更多压缩,但这只会降低其可读性。
注意:与您的确切相符。我认为我的另一个方向是螺旋式的。
var size = 21;
for (var h = 0; h < size; h++) {
var line = "";
for (var w = 0; w < size; w++) {
if (h < size/2) {
if (h % 2 === 0) {
if (w >= h && w < size - h) {
line += "A";
}
else {
line += (w % 2 === 0) ? "B" : " ";
}
}
else {
if (w >= h && w < size - h) {
line += " ";
}
else {
line += (w % 2 === 0) ? "C" : " ";
}
}
}
else {
if (h % 2 === 0) {
if (w < h - 1 && w >= size - h) {
line += "D";
}
else {
line += (w % 2 === 0) ? "E" : " ";
}
}
else {
if (w < h - 1 && w >= size - h) {
line += " ";
}
else {
line += (w % 2 === 0) ? "F" : " ";
}
}
}
}
console.log(line);
}
答案 1 :(得分:1)
我有一个python解决方案pixelscan,它可以遍历各种空间模式中的像素,包括像你一样的方形环。基本思想是在8个基本方向之一中移动像素到像素,同时保持每个环的特定度量常数,在您的情况下,它是chebyshev度量。
答案 2 :(得分:0)
我解决了它类似于在螺旋上迭代矩阵。
这是Python,但理解JavaScript等价物是微不足道的。
def spiral(n):
out = []
for i in range(0, n):
line = []
out.append(line)
for x in range(0, n):
line.append(' ')
x_start = 0
y_start = 0
x_stop = n
y_stop = n
while x_stop >= x_start:
for x in range(x_start, x_stop):
out[y_start][x] = '*'
for y in range(y_start + 1, y_stop):
out[y][x_stop - 1] = '*'
y_start += 2
for x in range(x_stop - 1, x_start, -1):
out[y_stop - 1][x] = '*'
y_stop -= 1
x_start += 1
for y in range(y_stop - 1, y_start - 1, -1):
out[y][x_start] = '*'
x_stop -=2
y_stop -= 1
x_start += 1
for y in range(0, n):
print(''.join(out[y]))