需求:要得到一个二维数组中每一行和每一列中连续重复三次或三次以上的元素的位置数组。
如上图所示中的这个数组,我们要得到的位置数组为
[
{ row: 0, col: 1 },
{ row: 0, col: 2 },
{ row: 0, col: 3 },
{ row: 0, col: 4 },
{ row: 1, col: 2 },
{ row: 2, col: 2 }
]
需求说完了,下面就是代码细节了
首先,我们要得到每一行连续重复3次或3次以上元素的位置数组
/**
计算数组中每一行的连续重复项3或者3次以上的元素的位置数组
本函数中用到的算法我将它称为"i j指针法"
params1 原数组
params2 是否为原数组的row和col颠倒过的新数组,是就为true,否则为false
return 返回应该消除的位置数组
* */
function rowChong(arr, isCol2Row) {
let results = [];
for (let row = 0; row < arr.length; row++) {
// i指针和j指针
let i = 0;
let j = 1;
let result = []; //存连续重复项的下标数组
while (i < arr[row].length) {
if (arr[row][j] != arr[row][i]) {
if (j - i >= 3) {
for (let m = i; m <= j - 1; m++) {
if (isCol2Row) {
results.push({"row": m, "col": row});
} else {
results.push({"row": row, "col": m});
}
}
}
i = j;
}
j++;
}
}
return results;
}
然后,我们要得到每一列连续重复3次或3次以上元素的位置数组
function colChong(arr) {
//为了使用rowChong()函数,所以需要将原数组的col颠倒成row
let cols = [];
for (let row = 0; row < arr.length; row++) {
let _col = [];
for (let col = 0; col < arr[row].length; col++) {
_col.push(arr[col][row]);
}
cols.push(_col);
}
return rowChong(cols, true)
}
最后:将每一行和每一列应该消除的位置数组合并成一个最终应该消除的位置数组
function getPositionArrs() {
//将每一行和每一列应该消除的位置数组合并成一个位置数组
let _result = rowChong(arr, false).concat(colChong(arr))
//result数组中可能存在重复元素,所以需要去重
//1.把每一项变成字符串
let resultArr = _result.map((item, index) => {
return JSON.stringify(_result[index]);
});
//2.利用set特性去重
let newresultArr = [...new Set(resultArr)];
//3.把每一项变回json
let results = newresultArr.map((item, index) => {
return JSON.parse(newresultArr[index]);
});
//返回最终去重过的位置数组
return results;
}
console.log(getPositionArrs());//打印出来的就是最终应该消除的位置数组