javascript - 蜗牛排序 - 卡在中间,不知道如何继续

标签 javascript arrays

我被困在这个地方,无法继续前进。问题是这样的。给定一个 n x n 数组,返回从最外层元素到中间元素排列的数组元素,顺时针移动。

array = [[1,2,3],
         [4,5,6],
         [7,8,9]]
snail(array) #=> [1,2,3,6,9,8,7,4,5]

为了更好地理解,请连续遵循下一个数组的数字:

array = [[1,2,3],
         [8,9,4],
         [7,6,5]]
snail(array) #=> [1,2,3,4,5,6,7,8,9]

这张图片将更清楚地说明事情:

到目前为止我的尝试是:

arr = [[1, 2, 3], [3, 4]];
var n = arr[0].length;
var i = 0, j = 0;
var fa = [];
var count = 0;
var direction = "right";
console.log(n);
while (fa.length < n * n) {
    fa.push(`${i}, ${j}`);
    if (j == n - 1 && i < n - 1) {
        direction = "down";
    } else if (j == 0 && i != 0) {
        direction = "up";
    } else if (i == n - 1) {
        direction = "left";
    } else if (i == 0) {
        direction = "right";
    }
    switch (direction) {
        case "right":
            j++;
            break;
        case "left":
            j--;
            break;
        case "up":
            i--;
            break;
        case "down":
            i++;
            break;
    }
    if (count++ == 15)
        break;
}
console.log(fa);

我有点不确定如何继续。我需要知道两件事。

  1. 我应该如何继续?
  2. 我犯了什么错误?

最佳答案

这是我为解决这个问题所做的事情。您可以看到我如何跟踪最小和最大列值以及行值。我不确定您在代码中具体是如何做到这一点的,但希望这会有所帮助。

var m = 4;
var n = 4;
var board = [
    [1, 2, 3, 4],
    [5, 6, 7, 8],
    [9, 10, 11, 12],
    [13, 14, 15, 16]
];

var result = [];
var dir = 'right';
var imin = 0;
var imax = m - 1;
var jmin = 0;
var jmax = n - 1

var i = imin;
var j = jmin;
var done = false;

while (!done)
{

    switch (dir)
    {
        case 'right':                
            i = imin;
            j = jmin;
            for (j; j <= jmax; j++)
                result.push(board[i][j]);
            console.log(result);
            dir = 'down';
            imin++;
            break;
        case 'left':
            i = imax;
            j = jmax;                
            for (j; j >= jmin; j--)
                result.push(board[i][j]);
            console.log(result);
            dir = 'up';
            imax--;
            break;
        case 'down':
            i = imin;
            j = jmax;
            for (i; i <= imax; i++)
                result.push(board[i][j]);
            console.log(result);
            dir = 'left';
            jmax--;
            break;
        case 'up':
            i = imax;
            j = jmin;
            for (i; i >= imin; i--)
                result.push(board[i][j]);
            console.log(result);
            dir = 'right';
            jmin++;
            break;
    }

    if (imin > imax || jmin > jmax)
        done = true;
}

console.log(result);

关于javascript - 蜗牛排序 - 卡在中间,不知道如何继续,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41576249/

相关文章:

arrays - 如何使用 swift 获取数组中项目的特定限制?

javascript - 从 js 文件所做的更改不会被渲染并且无法调试

javascript - 数据库或数组

javascript - 从循环内更新数据

c++ - 取一个数组引用 `T(&)[n]` 到一个 `std::array<T, n>` 的内容

javascript - 将数组对象添加到 HTML 表

javascript - 观察 setTimeout 循环,以便一次只有一个在运行

javascript - 将电子表格中的每个值返回到 Web 应用程序表

java - 为什么 3 和算法只查看特定数字右侧的子数组?

c - 将数组传递给函数