在数组中查找对角线,该数组表示二维数组

时间:2016-02-21 06:12:03

标签: javascript arrays

我将我的2d数组转换为1d数组。例如:(从0开始,而不是1);
00 01 02 03 04
05 06 07 08 09
10 11 12 13 14
15 16 17 18 19
20 21 22 23 24


被转换为1d数组。 [0,1,2,3,4 ...... 23,24]。

我现在正在尝试创建一个功能,找到每个被连接的位置"或者在数组中的某个元素旁边。这包括与其对角的元素。所以使用上面的2d数组,如果我想要一个连接到0的元素数组,我希望该函数返回数组 [1,5,6]。

我遇到的麻烦就是找到对角线。这是我应该返回的数组的JS代码。

var poss = [Number(num+1),Number(num-1),Number(num+col),Number(num-col),Number((num+col) + 1),Number((num+col) - 1),Number((num-col) + 1),Number((num-col) - 1)];

返回[1,5,6,4]。 我的代码不包括负数。但是,4不应该存在。 我意识到这是因为这是一个边缘情况,并且它没有注册为越界,因为它不是负数。是否有某种公式可以找到与其对角连接的元素?请记住我使用的是1d数组。该程序也独立于数组大小运行。因此,这也必须适用于4x4或5x4的电路板。所以使用row和num字段是理想的。

4 个答案:

答案 0 :(得分:1)

我似乎已经弄明白了。至少,我已经通过了所有测试用例。我确信这不是最简单,优雅或有效的方式。可能需要更多测试用例。我确保它的计算与列数和行数无关。这是我使用的巨大if语句。

var x = poss[i]
if((Number(num) % col == 0 && Number(num-1) == Number(x)) || 
 (Number(num+1) % col == 0 && Number(num+1) == Number(x)) || 
 ((Number(num) % col == 0 || Number(num+1) % col == 0) && (Number((num-col) -1) == Number(x))) || 
 ((Number(num) % col == 0 || Number(num+1) % col == 0) && (Number((num+col) -1) == Number(x))) ||
 ((Number(num) % col == 0 || Number(num+1) % col == 0) && (Number((num-col) +1) == Number(x))) || 
 ((Number(num) % col == 0 || Number(num+1) % col == 0) && (Number((num+col) +1) == Number(x)))) 
{//exclude number from results}

变量num是您当前正在搜索邻居的数组上的数字。变量x是可能的邻居之一。

随意发表另一个想法。

答案 1 :(得分:1)

这是我对这个问题的解决方案,它应该易于阅读和理解,我也在其中添加了一些评论。

jonstark@jonstark-pc:~/rails_projects$ rails -v
Rails 4.0.3

答案 2 :(得分:1)

您可以尝试使用position而不是value。这将简化事情。

你可以使用另一个函数来获取值的位置。



var arr = [
  [00, 01, 02, 03, 04],
  [05, 06, 07, 08, 09],
  [10, 11, 12, 13, 14],
  [15, 16, 17, 18, 19],
  [20, 21, 22, 23, 24]
]

function getNeighbours(x, y) {
  var result = [];
  for (var i = x - 1; i <= x + 1; i++) {
    for (var j = y - 1; j <= y + 1; j++) {
      if (arr[i] && arr[i][j]) {
        if (!(x === i && y === j))
          result.push(arr[i][j]);
      }
    }
  }
  return result;
}

console.log(getNeighbours(0, 0));
console.log(getNeighbours(3, 3));
&#13;
&#13;
&#13;

答案 3 :(得分:1)

使用数组时,尽可能多地在内循环外移动计算很重要。我的方法是在每一行中找到左列的起始位置,然后迭代列范围。

var arr = [
  0, 1, 2, 3, 4,
  5, 6, 7, 8, 9,
  10, 11, 12, 13, 14,
  15, 16, 17, 18, 19,
  20, 21, 22, 23, 24
]

function getNeighbours(col, row)
{
  var w = 5;
  
  var start = (row > 0 ? row * w - w : row * w) + (col > 0 ? col - 1 : col);
  var rowSpan = ((row > 0 ? 2 : 1) + (row < (w - 1) ? 1 : 0)) * w;
  var colSpan = (col > 0 ? 2 : 1) + (col < (w -1) ? 1 : 0);
  
  var center = col + row * w;
  var result = [];
  for (var r = start; r < start + rowSpan; r += w)
    for (var i = r; i < r + colSpan; i++)
      if (!(i === center))
         result.push(arr[i]);
      
  return result;
}


console.log(getNeighbours(0,0));
console.log(getNeighbours(3,3));
console.log(getNeighbours(3,4));
console.log(getNeighbours(4,3));
console.log(getNeighbours(4,4));
 
/*
[1, 5, 6]
[12, 13, 14, 17, 19, 22, 23, 24]
[17, 18, 19, 22, 24]
[13, 14, 18, 23, 24]
[18, 19, 23]
*/