我有一个包含 0 - 100 范围内数字的数组。我需要找到所有相同的数字并将它们加 1。
我的代码可以很好地处理 [100, 2, 1, 1, 0] 这样的数组
const findAndChangeDuplicates = (arr: any) => {
for (let i = arr.length - 1; i >= 0; i--) {
if (arr[i + 1] === arr[i] && arr[i] <= 5) {
arr[i] += 1;
} else if (arr[i - 1] === arr[i] && arr[i] >= 5) {
arr[i] -= 1;
findAndChangeDuplicates(arr);
}
}
return arr;
};
但是当我遇到这个 [100, 6, 6, 6, 5, 5, 5, 5, 5, 4, 4, 4, 3, 3, 2, 2, 2, 2, 1, 1, 0, 0]
我的代码让我失望。
预期结果: [100, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
有什么想法吗?
最佳答案
一种方法,从末尾开始至少使用一个循环来调整值,如有必要,从头开始使用另一个循环将最大值设置为 100
。
两个循环都有一个值变量v
。在第一个循环中,它从数组的最后一个值开始并递增它的值并检查该项目是否小于该值。
如果较小,则赋值,否则为下一项取实际值。
如有必要,另一个循环以相反的方向工作,起始值为 100
并检查该项目是否大于所需值并取较小的值,或者该值取自该项目.
结果是一个数组,该数组在开始时具有最大 100
值,直到零或大于数组末尾为止。
function update(array) {
var i = array.length,
v = array[--i];
while (i--) if (array[i] < ++v) array[i] = v; else v = array[i];
if (array[0] > 100) {
v = 100;
for (i = 0; i < array.length; i++) {
if (array[i] > v) array[i] = v; else v = array[i];
v--;
}
}
return array;
}
console.log(update([100, 2, 1, 1, 0]));
console.log(update( [100, 100, 99, 86, 6, 5, 5, 5, 5, 5, 4, 4, 4, 3, 3, 2, 2, 2, 2, 1, 1, 0, 0]))
.as-console-wrapper { max-height: 100% !important; top: 0; }
关于javascript - 找出数组中所有相同的数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57291686/