【发布时间】:2019-12-23 22:27:07
【问题描述】:
我正在处理一些关于 Code Signal 的 Javascript 挑战,并遇到了这个问题:
给定一个整数序列作为数组,判断它是否是 可以通过不再删除来获得严格递增的序列 数组中的一个元素以上。**
注意:序列 a0, a1, ..., an 被认为是严格的 如果 a0
示例 对于序列 = [1, 3, 2, 1],输出应为 几乎IncreasingSequence(sequence) = false。
这个数组中没有一个元素可以被移除 得到一个严格递增的序列。对于序列 = [1, 3, 2], 输出应该是几乎IncreasingSequence(sequence) = true。
您可以从数组中删除 3 以获得严格递增的 序列 [1, 2]。或者,您可以删除 2 以获得严格的 递增序列 [1, 3]。
我的做法是遍历序列数组,检查当前元素是否大于下一个元素,如果是则删除当前元素。然后,增加一个计数器,如果计数器小于2返回true,否则返回false。
这是我的代码:
function almostIncreasingSequence(sequence) {
// If array has 1 or 2 elements it passes
if(sequence.length <= 2) {
return true;
}
// Keeps track of numbers removed
let numberRemoved = 0;
// Iterate through array, check if current element is greater than next element
// If so, increment numberRemoved and remove current element
for(let i = 0; i < sequence.length; i++) {
if(sequence[i] >= sequence[i + 1]) {
numberRemoved++;
// Removed element if it's greater than next element
let removed = sequence.splice([i], 1);
i = 0;
console.log(sequence);
}
}
// Second pass through the array checks if there are 2 or more out of order
// elements. Inefficient and sloppy, need to find a better approach
for(let j = 0; j < sequence.length; j++) {
if(sequence[j] >= sequence[j + 1]) {
numberRemoved++;
}
}
// If number is less than 2, the sequence passes
if(numberRemoved < 2) {
return true;
}
else {
return false;
}
}
此解决方案解决了 17/19 个测试用例。我遇到了一个极端情况,有时如果 i >= [i + 1] 正确的方法是删除 [i + 1],而不是 >我。例如:
- 在序列的情况下:[3, 5, 67, 98, 3]
- For 循环检查 98 是否 >= 3
- 删除 98
- 序列失败,因为 [3, 5, 67, 3] 失败
- 在这种情况下,我们不应该删除 98,我们应该删除 3
- 序列然后通过:[3, 5, 67, 98] 返回 true
- 对于这种极端情况,我们不想这样做:let removed = sequence.splice([i], 1);
- 我们想做:let removed = sequence.splice([i + 1], 1);
- 这将删除 3
- [3, 5, 67, 98] 返回真
我该如何处理这种极端情况?在某些情况下如果 sequence[i] >= [i + 1] 您需要删除 sequence[i],在其他情况下您需要删除 [i + 1]。如何在不使用第二个 for 循环并再次通过数组的情况下解决此问题?
【问题讨论】:
-
检查是否
[i+1] < [i-1]。如果是,则删除[i+1]而不是[i]。
标签: javascript arrays for-loop iteration comparison