目标是将字符串转换为新字符串,其中新字符串中的每个字符为'('如果该字符仅在原始字符串中出现一次,或')',如果该字符在原始字符中出现多次串。在确定字符是否重复时忽略大写。
我的问题是,如果重复一封信,则第一个括号显示错误。
function duplicateEncode(word){
var repeat = [];
var result = [];
var letters = word.split('');
for (i=0; i < letters.length; i++){
if (repeat.indexOf(letters[i]) > -1) {
result.push(")");
} else {
result.push("(");
}
repeat.push(letters[i]);
}
return result.join("");
}
console.log(duplicateEncode("aleluia"))
答案 0 :(得分:1)
您可以使用.length
构造函数和RegExp
检查字符串中每个匹配字母的String.prototype.match()
。如果匹配字符的.length
为1
,则返回"("
,否则返回")"
const word = "aleluia";
let res = [...word].map(letter =>
word.match(new RegExp(letter, "ig")).length === 1 ? "(" : ")"
).join("");
console.log(res);
答案 1 :(得分:1)
“我的问题是,如果重复一个字母,则第一个括号显示错误。”
这是因为您的代码没有进行任何预测,它只检查已处理的字符。无论如何,您需要检查当前字母是否也在字符串中稍后出现或。
首先想到的方法是从计算所有字母(将计数放入对象)开始,然后根据计数对每个字母进行映射。这样你只需要完成两次原始单词:
function duplicateEncode(word){
var letterCount = {};
var letters = word.toLowerCase().split('');
letters.forEach(function(letter) {
letterCount[letter] = (letterCount[letter] || 0) + 1;
});
return letters.map(function(letter) {
return letterCount[letter] === 1 ? '(' : ')';
}).join('');
}
console.log(duplicateEncode("aleluia"))
console.log(duplicateEncode("AleLuia"))
console.log(duplicateEncode("No duplicates"))
console.log(duplicateEncode("All duplicated ALL DUPLICATED"))
或.reduce()
和arrow functions同样的事情只有三行:
function duplicateEncode(word){
const letters = word.toLowerCase().split('');
const counts = letters.reduce((ct, ltr) => ((ct[ltr] = (ct[ltr] || 0) + 1), ct), {});
return letters.map(letter => counts[letter] === 1 ? '(' : ')').join('');
}
console.log(duplicateEncode("aleluia"))
console.log(duplicateEncode("AleLuia"))
console.log(duplicateEncode("No duplicates"))
console.log(duplicateEncode("All duplicated ALL DUPLICATED"))
答案 2 :(得分:1)
const duplicateEncode = word => {
let newString = ''
word = word.toLowerCase() || word
word.split('').filter((x, index) => {
if(word.indexOf(x) !== index){
newString += ')'
}else if(word.lastIndexOf(x) !== index){
newString += ')'
}else{
newString += '('
}
})
return newString
}
duplicateEncode("O!!!!@k!!!H!!!)!!n!")
答案 3 :(得分:0)
这样:
'a' => '('
'aa' => '))'
'aba' => ')()'
'abA' => ')()'
'aba'
.toLowerCase()
.split('')
.reduce((acc, char, i, arr) => {
const symbol = arr.filter(letter => letter === char).length < 2 ? '(' : ')'
return acc + symbol
}, '')
答案 4 :(得分:0)
原因是你的result
数组在第二次迭代(i = 1)之前是空的。解决方案是从包含第一个元素的数组开始。
function duplicateEncode(word) {
var repeat = [];
var result = [];
var letters = word.split('');
for (i = 0; i < letters.length; i++) {
repeat.push(letters[0]);
if (repeat.indexOf(letters[i]) > -1) {
result.push(")");
} else {
result.push("(");
}
repeat.push(letters[i]);
}
return result.join("");
}
console.log(duplicateEncode("aleluia"))
&#13;
答案 5 :(得分:0)
function duplicateEncode(word){
let w = word.toLowerCase();
return Array.from(w).map(x => w.replace( new RegExp(`[^${x}]`, 'g') , "").length > 1 ? ')' : '(').join('');
}