2017-11-29 13 views
2

私はCodeWars Kata:ZerosとOnesを解決しようとしています。 私のコードは、1800を超える試行テストを解決し、100を超えて失敗します。 私の問題は、テストデータが大きすぎるために見ることができないことです。 他のkatasのテストデータを表示するには、console.logステートメントを使用できます。 しかし、このチャレンジのテストデータは大きすぎます。私は入力配列の最初の部分のリストを取得し、その後に "と400個以上の項目"を表示します。配列でJavaScriptコードが動作しないのはなぜですか?

以下は、いくつかのテストケースとともにkataとmy codeの説明です。 私のコード実行時に失敗するテストケースを作成しようとしました。しかし、私は失敗するものを作ることはできません。

  • 私のロジックは鳴っていますか?私は論理に何かを欠いていますか?
  • 失敗するテストケースを提供できますか? (それは私がそれを修正するために私のコードを分析しなければならないと私は学習に役立つ方が良いでしょう。)

のみ0と1を含む配列を指定して、変換した場合、 ゼロのインデックスを見つけます1つにすると、最も長いシーケンスが になります。例えば、配列が与えられた場合... [1,0,1,1,1,1,1,1,1,0,1,1,1,1,0,0,1,1]、 ... のインデックス10(0から数えて)でゼロを置き換えると、9個のシーケンスが形成されます。あなたの仕事は、 のゼロを最大長のサブシーケンスにするためにどこに置き換えるかを決定する関数replaceZero()を書くことです。 です。注: が複数の結果である場合、最後の[1,1,0,1,1,0,1,1] // => 5を返します。 配列には常に0と1が含まれます。よし

function replaceZero(arr){ 

var highestCt = 0; 
var returnIdx = 0; 

var onesCt = 0; 
var currentHighOnesCt = 0; 

function countOnes(currentIZ){ // The input should be the current index of the ZERO. 
    for(var j = currentIZ - 1; j >= 0; j--){ // Go backwards until a zero is found, or to the beginning of the array. 
    if(arr[j] === 1){ 
     onesCt = onesCt + 1; 
    } 
    else { // if arr[j] === 0 
     break; 
    } 
    } 
    for(var k = currentIZ + 1; k < arr.length; k++){ // Go forwards to a zero or the end of the array. 
    if(arr[k] === 1){ 
     onesCt = onesCt + 1; 
    } 
    else { // if arr[k] === 0 
     break; 
    } 
    } 
    if(onesCt >= currentHighOnesCt){ 
    currentHighOnesCt = onesCt; 
    returnIdx = currentIZ; 
    } 
    onesCt = 0; 
} 

for(var i = 0; i < arr.length - 2; i++) 
    if(arr[i] === 1 && arr[i + 1] === 0 && arr[i + 2] === 1){ 
    countOnes(i + 1); // Send the index of the ZERO. 
    } 

// console.log("returnIdx: " + returnIdx); 

return returnIdx; 
} 

/* 
replaceZero([0,0,1,1,1,0,1,1,0,0,1,0]); // 5 
replaceZero([0,0,0,1,1,1,0,1,1,0,0,0]); // 6 
replaceZero([1,1,1,1,0,1]); // 4 
*/ 
replaceZero([1,0,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1]); // 9 
replaceZero([1,0,0,0,1,0,1,1]); // 5 

/* 
replaceZero([0,0,1,1,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,1,0,1,1]); // 6 
replaceZero([0,0,1,0,0,1,1,1,0,1,1,0,0,1,1,0,1,1,0]); // 8 
replaceZero([0,0,1,0,0,1,1,0,1,1,0,0,1,1,1,0,1,1,0]); // 15 
replaceZero([1,0,1,1,1,0,1,1,1,1,0,1,1,1,1,0,0,1,1]); // 10; 
replaceZero([1,1,0,1,1,0,1,1]); // 5; 
replaceZero([1,1,1,0,1,1,0,1,1,1]); // 6); 
*/ 
+0

この質問は、https://codereview.stackexchange.com/ – charlietfl

+4

に適しています。コードレビューでルールを読みました。それはコードが機能している必要があると述べた。私のコードは動作していません。 – Janet

+1

あなたはkataへのリンクを提供できますか? – randomguy04

答えて

0

ので、私は実際にあなたのコードをリファクタリングするつもりはないが、これはあなたを助けるかもしれない:

  • あなたはZeroあなたが変更する必要がOnes 2の間にあると仮定しないのはなぜ?あなたのifステートメントに問題があります。

あなたのコード:

コード:

replaceZero([0,0,0,0,0,0,1]); // 0 
replaceZero([0,0,0,0,0,1,1]); // 0 
replaceZero([0,0,0,0,1,1,1]); // 0 
//.. and so on 
//Also 
replaceZero([1,1,1,1,1,0,0]); // 0 
replaceZero([1,1,1,1,0,0,0]); // 0 

をしてはいけない

if(arr[i] === 1 && arr[i + 1] === 0 && arr[i + 2] === 1){ //WHY IN BETWEEN?? 
    countOnes(i + 1); // Send the index of the ZERO. 
} 
  • 心の中で上記を持って、次のシナリオが失敗します。 [0,0,0,0,0,0,0]のテストがある場合は驚いたこの場合、配列の最後のインデックスが期待される答えです。

+0

良いありがとう。私はあなたがそれを書き直すことを望んでいない。私はちょうどそれが失敗しているか、なぜ私がそれを解決することができるのかを知りたい。うーん... OK。私は決して0,1,0シーケンスがないテストケースを考慮しませんでした。しかし、それはkataの記述で決して述べられていません。その可能性を考慮しなかったのは私のせいです。私はその状況のた​​めに自分のコードを書き直して、このポストに戻ってきます。ありがとう。 – Janet

+0

問題はありませんが、すべてのシナリオを明示的に説明していないかなりの数のkatasに遭遇することもありますが、時にはそれが困難なこともあります。もしあなたがそれが役に立つと分かっていれば、その答えをupvoteすることを忘れないでください。がんばろう! – randomguy04

+0

私はまだすべてを解決していませんが、あなたの提案は私のコードの問題に私を導いた: - 最長の文字列が配列の最後にあるというテストケースがあります。この文字列は、1つのゼロで区切られた文字列の組み合わせよりも長くなります。 - 1つのゼロで区切られた文字列の組み合わせよりも長い2つ以上のゼロで囲まれた文字列があるテストケースもあります。 テスト配列の先頭に2つ以上のゼロが続く文字列があるかどうかはわかりません。しかし、私はおそらくこれを説明すべきです。 – Janet

関連する問題