2017-10-05 63 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'));

相关问题