删除出现超过两次的字符串中的字符
问题描述:
我想删除字符串中第三次出现的字符。删除出现超过两次的字符串中的字符
下面是我从我的目的尝试:
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 ..我试图用这个正则表达式,以及要解决的问题。但是这并不能解决这个问题。
请帮
答
相反计数的出现,你应该检查出现计数您正在评估的具体指标。基本上,如果它出现了第三次或更多时间,那么你不需要它。
你的代码略有变化可以做到这一点(你可能想选择一个更好的函数名):
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));
注意,这个答案是根据你当前的代码,我希望你可以重构逻辑来减少代码混乱。
实际上,下面的代码会将代码缩减为单个循环。它通过构建字符计数字典来工作,因为它通过列表工作。 (它也并不依赖于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("");
}
答
另一种方法不依赖于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("");
}
答
这里我使用了两个帮助器阵列result
和tempCount
。tempCount
是每个字母存储的关键又算什么呢,所以如果是超过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));
答
号楼关闭的@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'));
其他人提供了解决方案,但关于使用正则表达式这个注释。正则表达式引擎允许可变宽度lookbehinds的语言可以解决这个问题,但javascript正则表达式不允许这样做,所以不能使用正则表达式。 –