[英]Why my code doesn't work correctly by sometimes returning true instead of false?
這是我的代碼:
function almostIncreasingSequence(sequence) { var counter = 0; for (var i = 1; i < sequence.length - 1; i++) { if (sequence[i] <= sequence[i - 1]) { counter += 1; } else if (sequence[i + 1] <= sequence[i - 1]) { counter += 1; } } if (counter <= 1) { return true; } return false; } console.log(almostIncreasingSequence([1, 3, 2, 1])); console.log(almostIncreasingSequence([1, 2, 5, 5, 5])); console.log(almostIncreasingSequence([1, 2, 3, 4, 3, 6]));
此代碼的工作是:
給定一系列整數作為數組,請確定是否有可能通過從數組中刪除不超過一個元素來獲得嚴格遞增的序列。
例
對於sequence = [1, 3, 2, 1]
,輸出應為
almostIncreasingSequence(sequence) = false;
為了獲得嚴格遞增的順序,此數組中沒有一個元素可以刪除。
對於sequence = [1, 3, 2]
,輸出應為
almostIncreasingSequence(sequence) = true.
您可以從數組中刪除3
以獲得嚴格遞增的序列[1, 2]
。 或者,您可以刪除2
以獲得嚴格遞增的序列[1, 3]
。
但是,即使經過一堆編輯,它也無法正常工作。 當前,這些是代碼無法在其上正確運行的數組:
[1, 3, 2, 1]
返回true而不是false。
[1, 2, 5, 5, 5]
它返回true而不是false。
[1, 2, 3, 4, 3, 6]
它返回false而不是true。
很久以前,我正在編輯此代碼,每次添加內容/編輯內容時,一個問題都會得到解決,但另一個問題卻變得一團糟,並且一直保持這種狀態。
編輯:請告訴我為什么它不起作用,請不要給我正確的代碼。
function increasingSequence(sequence,i){ sequence = Array.prototype.slice.call(sequence); sequence.splice(i,1) var len = sequence.length; for(var i=0;i<len-1;i++){ if(sequence[i]>=sequence[i+1])return false; } return true; } function almostIncreasingSequence(sequence) { var len = sequence.length; for(var i=0;i<len-1;i++){ if(sequence[i]>=sequence[i+1]){ return increasingSequence(sequence,i)||increasingSequence(sequence,i+1) } } return true; } console.log(almostIncreasingSequence([1,2,3])); console.log(almostIncreasingSequence([1,3,2])); console.log(almostIncreasingSequence([1,2,3,3,2]));
我想從現在已刪除的帖子中做出正確的答案:
function almostIncreasingSequence(sequence) {
return sequence.map((_, index) => [...sequence.slice(0, index), ...sequence.slice(index + 1)])
.some(arr => arr.every((value, index) => index === 0 || value > arr[index - 1]));
}
最有效的方法是只執行一次序列。 該代碼會記住先前的數字,並檢查當前數字是否更高。 如果它小於或等於,則將較高的數字標記為錯誤,因此下一個數字可以再次較高。
function isIncreasingWithMistakes(sequence) { prev = Number.MIN_VALUE; var mistakeCounter = 0; for (var number of sequence) { if (prev < number) { // The good case prev = number } else { // Found a mistake mistakeCounter += 1 prev = Math.min(prev, number) // Eliminate the higher number } // Stop immediately when there are too many mistakes if (1 < mistakeCounter) { return false } } return true } // These should be true console.log(isIncreasingWithMistakes([1, 2, 3, 4, 3, 6])) console.log(isIncreasingWithMistakes([10, 1, 2, 3, 4, 5])) // These should be false console.log(isIncreasingWithMistakes([1, 3, 2, 1])) console.log(isIncreasingWithMistakes([1, 2, 5, 5, 5])) console.log(isIncreasingWithMistakes([1,2,3,4,3,6,1]))
這似乎有效
function _doAlmostIncreasingSequence(_seq, recheck) { var warning = 0; var _control = _seq[0] - 1; for (var i = 0; i < _seq.length; i++) { var _test = _seq[i]; if (_test <= _control) { if (recheck) { var test1 = _seq.slice(0); var test2 = _seq.slice(0); test1.splice(i, 1); test2.splice(i - 1, 1); return _doAlmostIncreasingSequence(test1) || _doAlmostIncreasingSequence(test2); } return false; } _control = _test; } return true; } function almostIncreasingSequence(_seq) { return _doAlmostIncreasingSequence(_seq, 1); } console.log("TRUE :", almostIncreasingSequence([1, 2, 3, 5, 4, 5, 6])); console.log("TRUE :", almostIncreasingSequence([10, 1, 2, 3, 4, 5, 6])); console.log("TRUE :", almostIncreasingSequence([4, 5, 6, 6, 7, 8])); console.log("FALSE :", almostIncreasingSequence([4, 5, 6, 1, 2, 3])); console.log("TRUE :", almostIncreasingSequence([1, 3, 4, 6, 7, 8, 1, 10, 11, 12])); console.log("FALSE :", almostIncreasingSequence([1, 3, 2, 1])); console.log("FALSE :", almostIncreasingSequence([1, 2, 5, 5, 5])); console.log("TRUE :", almostIncreasingSequence([1, 2, 3, 4, 3, 6]));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.