【问题标题】:Reducing duplicate characters in a string to a given minimum将字符串中的重复字符减少到给定的最小值
【发布时间】:2016-10-06 17:32:40
【问题描述】:

我在这里搞砸了第一个问题:Reduce duplicate characters to a desired minimum,我正在寻找比我想出的更优雅的答案。它通过了测试,但很想看到其他解决方案。样本测试是:

reduceString('aaaabbbb', 2) 'aabb'  
reduceString('xaaabbbb', 2) 'xaabb' 
reduceString('aaaabbbb', 1) 'ab'    
reduceString('aaxxxaabbbb', 2)  'aaxxaabb'

和我的解决方案(通过这些测试):

reduceString = function(str, amount) {
  var count = 0;
  var result = '';
  for (var i = 0; i < str.length; i++) {
    if (str[i] === str[i+1]) {
      count++;
      if (count < amount) {
        result += str[i];
      }
    } else {
      count = 0;
      result += str[i];
    } 
  };
  return result;
}

【问题讨论】:

  • 大概你想要连续重复的字符,而不仅仅是重复?
  • @RobG 是的,根据他们测试的样本,他们看起来就是这样。

标签: javascript string duplicates character


【解决方案1】:

只需使用正则表达式。

var reduceString = function (str, amount) {
    var re = new RegExp("(.)(?=\\1{" + amount + "})","g");
    return str.replace(re, "");
}

【讨论】:

  • @MarcoValente 确实如此!
  • 我需要把你的答案写下来;)
  • 不错!我试图用正则表达式来做,但这很棒!
【解决方案2】:

我想我最好的解决方案是

var str = "axxxaabbbbcaaxxxaab",
 redStr = (s,n) => s.replace(/(\w)\1+/g,"$1".repeat(n));
console.log(redStr(str,2));

【讨论】:

    【解决方案3】:

    我试图让它尽可能短:

    reduceString = function(str, amount) {
        var finalString = '', cL = '', counter;
        str.split('').forEach(function(i){
            if (i !== cL) counter = 0;
            counter++;
            cL = i;
            if (counter <= amount ) finalString = finalString + i;
        });
        return finalString;
    }
    

    【讨论】:

      【解决方案4】:

      您可以改用 reg 表达式。在 javascript 中测试。

      它是如何工作的:

      (.) //match any character
      \1 //if it follow by the same character
      +{2 //more than 1 times
      /g //global
      $1 //is 1 time by $1$1 is 2 times 
      
           reduceString('aaaabbbb', 2) 
           reduceString('xaaabbbb', 2) 
                  reduceString('aaaabbbb', 1)     
                  reduceString('aaxxxaabbbb', 2) 
      
                  function reduceString(txt,num)
                  {
                      var canRepeat=['$1'];
                     for (i=1;i<num;i++)
                     {
                        canRepeat.push('$1')
                     }
                      canRepeat = canRepeat.join('');
      
                      console.log(txt.replace(/(.)\1{2,}/g, canRepeat))
      
                  }      
      

      【讨论】:

      • 看看@e4en,它更干净了。 :)
      【解决方案5】:

      使用正则表达式:

      var reduceString = function(str, amount) {
      var x = [ ...new Set(str) ];
      for (var c of x){
          var rex = new RegExp(c + '{'+amount+',}','g');
          str = str.replace(rex,string(c,amount));
        }
        return str;
      };
      
      var string = function(c,amount){
          for(var i=0,s="";i<amount;i++)s+=c;
          return s;
      };
      

      【讨论】:

        猜你喜欢
        • 2017-05-13
        • 2011-01-09
        • 2017-02-09
        • 2015-01-22
        • 1970-01-01
        • 2020-10-05
        • 2011-01-28
        • 2017-10-09
        相关资源
        最近更新 更多