2017-10-05 12 views
2

文字列から3番目の文字を削除します。2回以上出現する文字列から文字を削除します

入力:DGHKHNL

入力:AFKLABAYBIB

期待DGHKHHNL

ここ

function unique(list) { 
    var result = []; 
    function findOccurrences(arr, val) { 
     var i, j, 
      count = 0; 
     for (i = 0, j = arr.length; i < j; i++) { 
      (arr[i] === val) && count++; 
     } 
     return count; 
    } 
    $.each(list, function(i, e) { 
     if (findOccurrences(list, e) < 3) result.push(e); 
    }); 
    return result.join(""); 
} 
var srting = "DGHKHHNL"; 
var thelist = srting.split("") 
console.log(unique(thelist)); 

は、いくつかの予想結果である:以下

は、私は私の端から試したものです

期待:AFKLABYBI

入力:期待

JNNNKNND

:JNNKD

https://regex101.com/r/WmUPWW/1は..私はこの問題を解決するだけでなく、この正規表現を使用してみました。しかし、これでも問題は解決されません。

代わりに出現をカウントする

+0

その他のソリューションを提供しますが、このために正規表現を使用してについての注意ています。 regexエンジンで可変幅のlookbehindが許可されている言語はこれを解決できますが、javascriptの正規表現では許可しないため、正規表現だけでは使用できません。 –

答えて

1

を助けてください、あなたは評価している特定のインデックスの出現回数をチェックする必要があります。基本的には、それが現れたのが3回以上ある場合は、それを望んでいません。この答えは、あなたの現在のコードに基づいていることを

function unique(list) { 
    var result = []; 

    function findOccurrenceIndex(arr, val, index) { 
    var i, j, 
     count = 0; 
    for (i = 0, j = arr.length; i < j; i++) { 
     (arr[i] === val) && count++; 
     if (i == index) { 
     return count; 
     } 
    } 
    return count; 
    } 

    $.each(list, function(i, e) { 
    if (findOccurrenceIndex(list, e, i) < 3) result.push(e); 
    }); 

    return result.join(""); 
} 
var srting = "DGHKHHNL"; 
var thelist = srting.split("") 
console.log(unique(thelist)); 

Here is a working example


注:あなたのコードへ

わずかな変化は、これを(あなたがより良い関数名を選択したい場合があります)を達成することができます、私はあなたがコードの混乱を減らすためにロジックをリファクタリングできると期待しています。

実際、次のコードでは、コードを単一のループに減らしています。これは、文字カウントの辞書を構築することによって動作します。 (それはまた、あなたのオリジナルの試みのようにjQueryのに依存しない):

function unique(list) { 
    var result = []; 
    var counts = {}; 

    for (var i = 0; i < list.length; i++) { 
    var c = list[i]; 
    if (!counts[c]) 
     counts[c] = 0; 
    counts[c]++; 
    if (counts[c] < 3) { 
     result.push(c); 
    } 
    } 

    return result.join(""); 
} 

Here is a working example

+0

ありがとうございました。正確に私が欲しかったのは – biky

+0

@SharmisthaKhound:心配しないで、興味があれば別の方法を追加しました。 – musefan

1

(あなたは簡単にはforEachとすることを入れ替えることができますが)はjQueryに依存しない別の方法:

function unique(str) { 
    var count = {} 
    return str.split("").reduce((acc, cur) => { 
     if (!(cur in count)) { 
      count[cur] = 1; 
      acc.push(cur); 
      return acc; 
     } 

     if (count[cur] == 2) return acc; 

     acc.push(cur); 
     count[cur]++; 
     return acc; 
    }, []).join(""); 
} 
1

ここでは、2つのヘルパーアレイresulttempCountを使用しました。tempCountは、それが@musefanによって答えをオフに構築以上の3

function unique(list) { 
    var result = []; 
    var tempCount = []; 
    list = list.split(""); 
    for(var i=0;i < list.length;i++) { 
     if(tempCount[list[i]]) { 
      if(tempCount[list[i]] == 2) continue; 
      tempCount[list[i]]++; 
     } else { 
      tempCount[list[i]] = 1;    
     } 
     result.push(list[i]); 
    } 
    return result.join(""); 
} 
var srting = "JNNNKNND"; 
console.log(unique(srting)); 
1

を超えている場合は、別のES6のアプローチは、アキュムレータに基づいてカウント/出力を構築するためにArray.reduceを使用できるように、キーとして各アルファベットを保存し、それをカウントしていますオブジェクト:あなたは重複をカウントし、アウトを発生させる懸念を分離するために、関数型プログラミングの原則を適用することによって、これを改善することができます

const onlyTwo = list => list.split('').reduce((cache, letter) => { 
 
    cache[letter] ? cache[letter]++ : cache[letter] = 1; 
 
    if (cache[letter] < 3) cache.output += letter; 
 
    return cache; 
 
}, { 
 
    output: '' 
 
}).output; 
 

 
console.log(onlyTwo('DGHKHHNL')); 
 
console.log(onlyTwo('AFKLABAYBIB')); 
 
console.log(onlyTwo('JNNNKNND'));

文字列を入力します。このようにして、異なるmax値で同じ蓄積技術を利用することができます。

const maxDuplicates = max => list => list.split('').reduce((cache, letter) => { 
 
    cache[letter] ? cache[letter]++ : cache[letter] = 1; 
 
    if (cache[letter] <= max) cache.output += letter; 
 
    return cache; 
 
}, { 
 
    output: '' 
 
}).output; 
 

 
const onlyTwo = maxDuplicates(2); 
 

 
console.log(onlyTwo('DGHKHHNL')); 
 
console.log(onlyTwo('AFKLABAYBIB')); 
 
console.log(onlyTwo('JNNNKNND')); 
 

 
const onlyOne = maxDuplicates(1); 
 

 
console.log(onlyOne('DGHKHHNL')); 
 
console.log(onlyOne('AFKLABAYBIB')); 
 
console.log(onlyOne('JNNNKNND'));

関連する問題