【问题标题】:Find how many times a char is repeated in a string and remove those repeated chars by a dynamic number找出一个字符在字符串中重复了多少次,并通过动态数字删除那些重复的字符
【发布时间】:2021-01-19 12:14:12
【问题描述】:

我想编写一个接收两个参数的函数:字符串和数字。 该函数将返回另一个与输入字符串相似但包含某些字符的字符串 删除。 该函数将从相同的连续运行中删除字符 字符,其中运行的长度大于输入参数。

例如:

"aaab", 2 => "aab"

"aabb", 1 => "ab"

"aabbaa", 1 => "aba"

我做了什么:

function doSomething(string,number) {
    let repeatCount = 0
   
    debugger;
    for (let i = 0; i < string.length; i++) {
     if(string[i] == string[i+1]){
         repeatCount++
     } 
      if(repeatCount > number ){
         string.replace(string[i],'') 
      }  
    }

    console.log(string)

}
doSomething('aaab',2)

console.log(string) 打印 'aaab' 但我希望它打印 'aab' 因为 number 是 2 并且字符 'a' 重复 3 次。

如果有其他更好的方法,我会很乐意学习。

【问题讨论】:

    标签: javascript string


    【解决方案1】:

    如果有其他更好的方法,我会很乐意学习。

    您可以使用.replace() 方法和带有反向引用的正则表达式来匹配连续的字母。然后您可以使用.slice() 删除额外的字母以使其达到定义的长度,如下所示:

    function shorten(string,number) {
      return string.replace(/(.)\1+/g, m => m.slice(0, number))
    }
    
    console.log(shorten("aaab", 2))// => "aab"
    
    console.log(shorten("aabb", 1))// => "ab"
    
    console.log(shorten("aabbaa", 1))// => "aba"

    上面的正则表达式将匹配任何字符并将其分组(.)。然后使用\1+ 再次检查该匹配字符以查看它是否重复了一次或多次。然后,将为每个连续运行的字母调用替换函数,您可以使用 .slice() 将其修剪到所需的长度。

    例如,取字符串aabbaa。正则表达式尝试查找连续运行的字符。 (.) 将匹配任何字符,在这种情况下,它会找到 "a" 并将其放入名为“1”的“捕获组”中。现在正则表达式试图通过检查分组(即字符“a”)是否跟随它一次或多次来查找“a”是否跟随一个或多个“a”字符。这是使用\1+ 完成的。这个正则表达式匹配的aabbaa字符串的第一部分是“aa”,当我们匹配“a”时,捕获它,发现它与\1+重复。找到匹配项时,将运行函数 m =&gt; m.slice(0, number)。这个函数接受匹配(m),在本例中是"aa",并返回它的切片版本,给出“a”。这然后用返回的值替换我们从原始字符串匹配的“aa”,从而导致“aa”被转换为“a”(注意这个转换不会修改原始字符串,它发生在得到的新字符串中由 replace 方法返回)。正则表达式末尾的/g 表示对整个字符串重复此操作。结果,我们的正则表达式继续前进并找到“bb”。然后再次调用该函数,但这次将m 设置为"bb",导致“bb”转换为“b”。最后,我们匹配“aa”,这导致“aa”转换为“a”。一旦替换完成整个字符串,它会返回带有返回值的结果(以及它没有修改的原始字符串的部分),因此它给出“aba”

    【讨论】:

    • 嘿伙计,你能解释一下 string.replace() 内部发生了什么吗? /(.)\1+/g 部分
    • @BarLevin 我已经编辑了我的答案,试图在原始解释下更详细地解释它
    • @BarLevin 也值得看看regexr.com/5ki6r,看看正则表达式是如何匹配的,这可能会清除一些事情
    【解决方案2】:

    并不是说您的其余代码是正确的。但是您犯的一个基本错误是,javascript 中的字符串是不可变的。您不能像那样更改字符串的元素。

    string.replace(string[i],'')
    

    这不会改变“字符串”。您必须从中创建另一个字符串。

    let str = string.replace(string[i],'')
    

    【讨论】:

      【解决方案3】:

      function doSomething(string,number) {
          let repeatCount = 0
         
          debugger
          let sameletter=string[0]
          for (let i = 0; i < string.length;i++) {
           if(string[i] == sameletter){
               repeatCount++
               if(repeatCount>number){
                var result = string.split('')
                result.splice(i, 1)
                string = result.join('')
                i--
               }
           }
           else{
             sameletter=string[i];
             repeatCount=1;
           }
          }
      
          console.log(string)
      
      }
      doSomething('aaaabbbbeeeffffgggggggggg',2)

      试试这个

      【讨论】:

        猜你喜欢
        • 2023-03-30
        • 2021-12-25
        • 2017-04-28
        • 1970-01-01
        • 1970-01-01
        • 2012-12-06
        • 1970-01-01
        • 1970-01-01
        • 2020-03-30
        相关资源
        最近更新 更多