重复编码器(字符串中的重复字母)

时间:2017-07-14 03:46:40

标签: javascript

目标是将字符串转换为新字符串,其中新字符串中的每个字符为'('如果该字符仅在原始字符串中出现一次,或')',如果该字符在原始字符中出现多次串。在确定字符是否重复时忽略大写。

我的问题是,如果重复一封信,则第一个括号显示错误。

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

6 个答案:

答案 0 :(得分:1)

您可以使用.length构造函数和RegExp检查字符串中每个匹配字母的String.prototype.match()。如果匹配字符的.length1,则返回"(",否则返回")"

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)之前是空的。解决方案是从包含第一个元素的数组开始。

&#13;
&#13;
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;
&#13;
&#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('');
}