2017-10-05 79 views
2

我想刪除字符串中第三次出現的字符。刪除出現超過兩次的字符串中的字符

下面是我從我的目的嘗試:

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)); 

這裏有一些預期的結果:

輸入:DGHKHHNL

預計:DGHKHNL

輸入:AFKLABAYBIB

預計:AFKLABYBI

輸入:JNNNKNND

預計:JNNKD

https://regex101.com/r/WmUPWW/1 ..我試圖用這個正則表達式,以及要解決的問題。但是這並不能解決這個問題。

請幫

+0

其他人提供瞭解決方案,但關於使用正則表達式這個註釋。正則表達式引擎允許可變寬度lookbehinds的語言可以解決這個問題,但javascript正則表達式不允許這樣做,所以不能使用正則表達式。 –

回答

1

相反計數的出現,你應該檢查出現計數您正在評估的具體指標。基本上,如果它出現了第三次或更多時間,那麼你不需要它。

你的代碼略有變化可以做到這一點(你可能想選擇一個更好的函數名):

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

另一種方法不依賴於jQuery的(雖然你可以很容易地交換與一個foreach):

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

這裏我使用了兩個幫助器陣列resulttempCounttempCount是每個字母存儲的關鍵又算什麼呢,所以如果是超過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

號樓關閉的@musefan答案,另一種方法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'));

可以通過應用功能編程原理分離計數重複併產生出的關注提高這把字符串。這樣你可以利用不同最大值的相同累加技術。

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'));

相關問題