2

下の質問で困っています。基本的に、str1 の一部を str2 に再配置できる場合に true を返すコード/関数を作成する必要があります。

str1 文字の一部を再配置して str2 に一致させることができる場合は true を返し、それ以外の場合は false を返す関数 scramble(str1,str2) を記述します。

例: str1 は 'rkqodlw' で、str2 は 'world' です。出力は true を返す必要があります。str1 は「cedewaraossoqqyt」であり、str2 は「codewars」であり、true を返す必要があります。str1 が「katas」で str2 が「steak」の場合、false が返されます。

小文字のみが使用されます (az)。句読点や数字は含まれません。パフォーマンスを考慮する必要があります。

以下は私が持っている現在のコードです:

function scramble(str1, str2) {
  var first; //longer string
  var second; //shorter string

  if(str1 || str2 === "undefined") {
    return false;
  }

  if(str1.length > str2.length) {
    first = str1;
    second = str2
  } else if(str2.length > str1.length) {
    first = str2;
    second = str1;
  }

  for (i=0; i<second.length; i++) {
    if (first.indexOf(second[i]) === -1) {
      return false;
    }
  }

  return true;

}

この質問について教えてください。

4

4 に答える 4

6

文字数でハッシュテーブルを使用し、カウントをチェックしてカウントを減らすことができます。

この提案は配列を変更しません。

function scramble(str1, str2) {
    var count = Object.create(null);

    Array.prototype.forEach.call(str1, function(a) {
        count[a] = (count[a] || 0) + 1;
    });

    return Array.prototype.every.call(str2, function(a) {
        return count[a]--;
    });
}

console.log(scramble('rkqodlw', 'world'));              // true
console.log(scramble('cedewaraaossoqqyt', 'codewars')); // true
console.log(scramble('katas', 'steak'));                // false
console.log(scramble('', 'o'));                // false

于 2016-11-26T21:10:57.860 に答える
1

文字列を配列に分割し、2 番目の配列のすべての文字が最初の配列内にあるかどうかを確認します。

おそらく、同じ文字の倍数を考慮するために、文字をつなぎ合わせたいと思うでしょう。

function scramble(str1, str2) {
    var [arr1, arr2] = [str1.split(''), str2.split('')];
    return arr2.every(x=>arr1.indexOf(x)===-1?false:arr1.splice(arr1.indexOf(x),1));
}

console.log( scramble('rkqwodlw', 'world') );     // true
console.log( scramble('mgoaon', 'moon') );        // true
console.log( scramble('oijhnnassduda', 'moon') ); // false, only one "o"
console.log( scramble('test', 'unicorn') );       // false

于 2016-11-26T21:05:05.823 に答える
1

いくつかのテストを含む関数は次のとおりです。

function scramble(str1, str2) {
  var l = str2.length;
  for (var i = 0; i < l; i++) {
    if (str1.indexOf(str2[i]) > -1) {
      str1 = str1.replace(str2[i], '');
    } else {
      return false;
    }
  }
  return true;
}

function test(str1, str2) {
  console.log('testing "'+str1+'" w/ "'+str2+'": '+(scramble(str1, str2) ? 'true' : 'false'));
}

test('rkqodlw', 'world');
test('cedewaraaossoqqyt', 'codewars');
test('katas', 'steak');

テストが返されます:

testing "rkqodlw" w/ "world": true
testing "cedewaraaossoqqyt" w/ "codewars": true
testing "katas" w/ "steak": false

この関数は、str2 のすべての文字が str1 にあるかどうかをチェックし、str1 からの文字が 2 回カウントされないように、それを str1 から削除します。

于 2016-11-26T21:05:28.070 に答える