0

私はこの問題に数時間悩まされており、進歩していません。これはシンプルであるべきだと思います。Filter や Reg ex などのメソッドを使用せずに、文字列内の重複する文字を削除しようとしています。

これが私の現在のコードです:

var duplicate = function(string) {
  var newString = string.split("");
  var finalArrayWithNoDuplicates = []

  for (var i = 0; i < newString.length; i++){
    for (var=0; j < newString.length; i++){
      while(newString[i])
        if (newString[i] !== newString[j]){

        }
    }
  }

  return finalArrayWithNoDuplicates.join("");

};

一度に 1 文字ずつフィルター処理することはできますが、while ステートメントのチェーンを下っていくにつれて、元々フィルター処理されていた文字を追加しています。

このアルゴリズムのアルゴリズム チュートリアルはすべて、私が見つけた Java にあります。aa for および while ループのみを使用してこれを行う方法はありますか?

4

3 に答える 3

1

提案されたコードにはいくつかの問題があります。

  • 重大なエラーがあります (内側のループがすべて間違って記述されています)
  • 配列を含める必要はまったくありません。文字列で十分です。
  • 「if char !== other char」チェックは、対処するのに十分な情報を提供しません

for ループと同じ基本的な考え方を使用した代替バージョンを次に示します。

function deduplicate(str) {
    var result = "";
    for (var i = 0; i < str.length; ++i) {
        var found = false;
        for (var j = 0; j < i; ++j) {
            if (str[i] == str[j]) {
                found = true;
                break;
            }
        }
        if (!found) result += str[i];
    }

    return result;
}

str[i]入力文字列の各文字は、str[j]その前にあるすべての文字と比較されます (次の文字と比較しても意味がありません。いずれにせよ順番が来たら処理するからです)。文字がその前の文字のいずれとも等しくない場合、その文字が最初に表示されたものであることがわかり、結果に含まれます。

このアルゴリズムのパフォーマンスは O(n²) であることに注意してください。これは、他の可能なアプローチと比較して非常に劣っています。その主なセールス ポイントは、単純明快で、すべてが「目の前で」行われることです。

于 2013-11-08T22:08:00.330 に答える
0
  1. ネストされた 2 つの for ループは不要
  2. 「while」ループも不要
  3. 次のコード行には 2 つのエラーがあります。1for (var=0; j < newString.length; i++){つ目はvar=0(コンパイル エラー)、2 つ目はij
  4. 一意の要素 (2 回表示されない) のみを追加することで実行できます。finalArrayWithNoDuplicates

次のように:

var duplicate = function(newString) {

  var finalArrayWithNoDuplicates = []
  var x = 0;
  for (var i = 0; i < newString.length; i++){
        // if the char appears in another index 
        // or if it's already in the result - don't add it
    if (newString.lastIndexOf(newString[i]) !== i || finalArrayWithNoDuplicates.indexOf(newString[i]) > -1){
            continue;
    }
    else{
      finalArrayWithNoDuplicates[x++] = newString[i];
    }

  }

  return finalArrayWithNoDuplicates.join("");

};

var arr = [1,2,3,4,5,4,5,6,7];
alert(duplicate(arr));

出力:

1234567

于 2013-11-08T22:14:14.043 に答える