2017-11-07 13 views
-2

整数の配列が配列である場合、配列から複数の要素を削除することによって厳密に増加する配列を得ることができるかどうかを判断します。配列がほぼ増加する配列を保持するかどうかを確認する

シーケンス= [1, 3, 2, 1]の場合、出力は

almostIncreasingSequence(sequence) === false 

は厳密に増加するシーケンスを得るために取り外すことができ、この配列には一つの要素はありませんする必要があります。あなたは厳密に増加シーケンス[1, 2]を取得するために、アレイから3を削除することができたよう

シーケンス= [1, 3, 2]の場合、出力は

almostIncreasingSequence(sequence) === true 

をする必要があります。あるいは、2を取り除いて厳密に増加するシーケンス[1, 3]を得ることができます。私はこの問題を解決する方法を把握しようとしている

function almostIncreasingSequence(sequence) { 
    //compare current int to previous, return true if greater than 
    //remove int at index and compare with new values, return false if comparison fails 
    var result = false; 

    for(var i = 0; i < sequence.length; i++){ 
    var newSequence = sequence.slice(); 
    var subSequence = newSequence.splice(i, 1); 

    for(var j = 0; j < newSequence.length - 1; j++){ 
     if(newSequence === newSequence.sort((a,b) => a < b).reverse()){ 
      result = true; 
     } 
    }   
    } 
    return result; 
} 

:ここ

は、私がこれまで持っているものです。私は非常に近いと思っていますが、何らかの理由で条件文でreverseを呼び出すと、newSequence変数もソートされます。条件付きで2つの変数をソートします.1つではありません。結果として、それは真実に解決されます。なぜこれが起こっているのか分かりません。どんなフィードバックもありがとうございます。

+1

'newSequence.sort()は'配列を変更し、それが新しい配列を返しません。 – Barmar

+1

'sort'の比較関数は' -1'、 '0'、または' 1'を返します。関数は 'true'または' false'を返します。 – Barmar

+1

'reverse()'は配列の場所を変更します。 – Barmar

答えて

4

ネストされたループを使用するために、また新しいアレイを作成する必要はありません。これは、Oで行うことができる(N)時間:

function almostIncreasingSequence(sequence) { 
 
    var prev = -Infinity, 
 
     beforePrev = -Infinity, 
 
     allowExceptions = true; 
 
    
 
    for (var curr of sequence) { 
 
     // Is order not maintained? 
 
     if (curr <= prev) { 
 
      // Give up when this is not the first exception 
 
      if (!allowExceptions) return false; 
 
      allowExceptions = false; 
 
      // Decide whether to skip the current or previous value 
 
      if (curr > beforePrev) prev = curr; 
 
     } else { // Normal case: keep track of two preceding values 
 
      beforePrev = prev; 
 
      prev = curr; 
 
     } 
 
    } 
 
    return true; 
 
} 
 

 
console.log(almostIncreasingSequence([1,5,3,4,8])); // true 
 
console.log(almostIncreasingSequence([1,5,0,6,8])); // true 
 
console.log(almostIncreasingSequence([1,5,0,4,8])); // false

+0

この回答は素晴らしい、非常に簡単で完全に動作します。 – kugyousha

1

sort()は、配列の場所を変更しますが、新しい配列を返しません。そして、==を使って2つの配列の内容を比較することはできないので、配列がソートされているかどうかを判断する良い方法はありません。単純に配列をループし、各要素が前の要素より大きいかどうかをテストすることができます。

function almostIncreasingSequence(sequence) { 
 
    for (var i = 0; i < sequence.length; i++) { 
 
    var newSequence = sequence.slice(); 
 
    newSequence.splice(i, 1); 
 
    var isSorted = true; 
 
    for (j = 1; isSorted && j < newSequence.length; j++) { 
 
     if (newSequence[j] <= newSequence[j-1]) { 
 
     isSorted = false; 
 
     } 
 
    } 
 
    if (isSorted) { 
 
     return true; 
 
    } 
 
    } 
 
    return false; 
 
} 
 

 
console.log(almostIncreasingSequence([1, 3, 2, 1])); 
 
console.log(almostIncreasingSequence([1, 3, 2])); 
 
console.log(almostIncreasingSequence([1, 2, 3, 4, 5, 3])); 
 
console.log(almostIncreasingSequence([8, 1, 2, 3, 4, 5])); 
 
console.log(almostIncreasingSequence([8, 1, 2, 2, 4, 5]));

+0

元々、ネストされたループを使って、この基準を満たす値に対してtrueを返す 'newSequence [j] Brayheart

関連する問題