繁体   English   中英

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

[英]Find the diagonals in an array that is a representation of a 2d array

我将我的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字段是理想的。

我似乎已经弄清楚了。 至少,我已经通过了所有测试用例。 我确信这不是最简单,优雅或有效的方式。 可能需要更多测试用例。 我确保它的计算与列数和行数无关。 这是我使用的巨大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是可能的邻居之一。

随意发表另一个想法。

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

var cols = 5;
var rows = 5;

function connectedPoints(point) {
  var connectedPoints = [];

  // First test if the point is on an edge
  var topEdge = point/cols < 1;
  var leftEdge = point%cols == 0;
  var rightEdge = point%cols == cols-1;
  var bottomEdge = point/cols >= rows-1;

  // Add points that are above the point
  if (!topEdge) {
    if (!leftEdge) {
      connectedPoints.push(returnIfNotNegative(point-cols-1));
    }

    connectedPoints.push(returnIfNotNegative(point-cols));

    if (!rightEdge) {
      connectedPoints.push(returnIfNotNegative(point-cols+1));
    }
  }

  // Add points that are to the left or right of the point
  if (!leftEdge) {
    connectedPoints.push(returnIfNotNegative(point-1));
  }
  if (!rightEdge) {
    connectedPoints.push(returnIfNotNegative(point+1));
  }

  // Add points that are below the point
  if (!bottomEdge) {
    if (!leftEdge) {
      connectedPoints.push(returnIfNotNegative(point+cols-1));
    }

    connectedPoints.push(returnIfNotNegative(point+cols));

    if (!rightEdge) {
      connectedPoints.push(returnIfNotNegative(point+cols+1));
    }
  }

  console.log(connectedPoints);
}

function returnIfNotNegative(point) {
  if (point < 0) {
    return null;
  }
  return point;
}

connectedPoints(0);

您可以尝试使用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)); 

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

 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] */ 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM