javascript - 如何在多维数组中找到彼此相邻的相同值?
问题描述
我试图编写一个函数,该函数将在多维数组(值从 3 到 7)中找到至少 3 次彼此相邻的重复值(垂直和水平)。如果它发现,将其更改为不同的值。比方说1。
我试图通过循环来做到这一点,但这似乎不是解决这个问题的好方法,或者我把它搞砸了。因为对于某些阵列它可以工作,而对于某些阵列则不能。
这是我的代码:
function searching(array) {
for (i = 0; i < array.length; i++) {
let horizontal = array[i][0];
let howMany = 1;
for (j = 1; j < array[i].length; j++) {
if (horizontal === array[i][j]) {
howMany += 1;
horizontal = array[i][j];
if (howMany >= 3) {
for (d = j; d > j - howMany; d--) {
array[i][d] = 0;
}
}
} else {
horizontal = array[i][j];
howMany = 1;
}
}
}
for (v = 0; v < array.length; v++) {
let vertical = array[0][v];
let howMany = 1;
for (x = 1; x < array.length; x++) {
if (vertical === array[x][v]) {
howMany++;
vertical = array[x][v];
if (howMany >= 3) {
for (d = x; d > x - howMany; d--) {
array[d][v] = 0;
}
}
} else {
vertical = array[x][v];
howMany = 1;
}
}
}
}
这个想法是例如给出数组:
let array = [
[3, 4, 5, 6, 7],
[3, 4, 5, 6, 7],
[3, 4, 5, 5, 5],
[3, 5, 6, 7, 4]
]
结果应该是:
let result = [
[1, 1, 1, 6, 7],
[1, 1, 1, 6, 7],
[1, 1, 1, 1, 1],
[1, 5, 6, 7, 4]
]
在此先感谢您提供任何解决方法的想法:) 问候!
解决方案
起初我不明白这个问题......所以这是我的代码:
let array = [
[3, 4, 5, 6, 7],
[3, 4, 5, 6, 7],
[3, 4, 5, 5, 5],
[3, 5, 6, 7, 4]
];
function replace(arr, target = 1) {
let needToChange = []; // save the index to change
const numbers = [3, 4, 5, 6, 7];
const m = arr.length; // m rows
const n = arr[0].length; // n columns
let mi = 0;
let ni = 0;
// search in row
for (mi = 0; mi < m; mi++) {
for (let x = 0; x < numbers.length; x++) {
const num = numbers[x]; // number to search
let counter = 0; // counter for this number in row mi
let tempArr = [];
for (ni = 0; ni < n; ni++) {
const currentNum = arr[mi][ni];
if (currentNum === num) {
counter++;
tempArr.push([mi, ni]);
}
}
if (counter >= 3) {
needToChange = needToChange.concat(tempArr);
}
}
}
// search in column
for (ni = 0; ni < n; ni++) {
for (let x = 0; x < numbers.length; x++) {
const num = numbers[x]; // number to search
let counter = 0; // counter for this number in row mi
let tempArr = [];
for (mi = 0; mi < m; mi++) {
const currentNum = arr[mi][ni];
if (currentNum === num) {
counter++;
tempArr.push([mi, ni]);
}
}
if (counter >= 3) {
needToChange = needToChange.concat(tempArr);
}
}
}
// replace
needToChange.forEach(([i, j]) => {
array[i][j] = target;
});
}
replace(array);
array.forEach(row => {
console.log(row.join(', '));
})
推荐阅读
- c# - 在 C# 设计期间读取项目的目标平台
- android - 错误:@Component.Builder 在 Dagger 2 中缺少所需模块或组件的设置器,而不是设置器方法
- swift - 如何在 SWIFTUI 正文视图中使用声明的变量
- wso2 - WSO2 SP 4.4.0 是否有计划将 siddhi 核心版本升级到 5x?
- java - 无法访问“BarCode”类中的“rawBytes”公共成员
- reactjs - 使用 redux-reset 清除 Redux Persist store
- amazon-web-services - AWS:如何每天将文件从 ec2 实例(Windows Server)传输到 S3?
- .net-core - 如何解决 .net Core 2.0 中的 Web API 超时异常
- python - Django 管理页面立即关闭
- javascript - 为客户端搜索进行多参数过滤的优雅方式