【问题标题】:Need to filter out repeating consecutive characters in a string using JavaScript需要使用 JavaScript 过滤掉字符串中重复的连续字符
【发布时间】:2016-10-07 03:47:43
【问题描述】:

这是 Codewars 中的挑战之一,我应该编写一个函数,该函数将接受一个字符串并返回一个数组,其中我不能有两个连续的相同元素。此外,顺序不应更改。

例如,如果我传递一个字符串"hhhhheeeelllloooooohhheeeyyy",那么函数应该返回一个array = ["h","e","l","o","h","e","y"]。

这是我的代码。

    var uniqueInOrder=function(iterable){
  //your code here - remember iterable can be a string or an array
     var unique = [];
   for( var i = 0; i < iterable.length; i++) {
      unique.push(iterable[i]);
   } 

   for( var j = 0, k = 1; j < unique.length; j++, k = j + 1 ){
      if(unique[j] === unique[k]){
         unique.splice(k,1);
     }
    }
   return unique;
 }

所以,如果我传递一个字符串,例如"hhhhheeeeeellllloooo",它不会像我预期的那样工作,因为j 的值不断增加,因此我无法过滤掉所有相同的元素。

我尝试调整逻辑,以便每当unique[j] === unique[k] 的值为零时,如果不是这种情况,那么事情将继续按预期进行。

这让我陷入了无限循环。

我需要你的帮助。

【问题讨论】:

  • 尝试只使用一份数据副本。试图比较两个副本并保持它们的索引是直的,这会使问题变得过于复杂。您需要跟踪的只是当前值以及下一个或上一个值。如果当前值等于其中任何一个,则丢弃一个,因为它是重复的。作为替代方案,您可以查看正则表达式。它们可以在一行中完成这种类型的替换,如果您现在开始使用正则表达式,您将永远找到它们的用途。
  • @LinuxDisciple 嗨,我想到了跟踪下一个或上一个值的想法,但我无法为此提供代码。我会再试几次,如果还是不明白,我会联系你。谢谢。

标签: javascript arrays string function


【解决方案1】:

第二个for loop 失败,因为unique.length 在运行期间不是恒定的。 我认为您的问题可以这样解决:

var temp = iterable[0];
unique.push(iterable[0]);
for( var i = 1; i < iterable.length; i++) {
   if(iterable[i] != temp) {
       unique.push(iterable[i]);
       temp = iterable[i];
   }
} 

希望对你有帮助!

【讨论】:

  • 如果第一个字符是唯一的,它如何进入unique? i 永远不会是 0...
  • 你是对的!所以让我们通过将第一个临时添加到我认为的唯一数组来修复?
  • 可以,但是temp 不总是等于unique 中的最后一个值吗?我们需要temp吗?
  • for 循环不会失败,因为 unique.length 是动态的,即会随着向数组中添加新元素而改变。
  • 是的,那个。我在 for 循环之前添加了一行额外的代码,即 unique.push(iterable[0])。
【解决方案2】:

您只需将iterable的当前索引与unique中的最后一个字符进行比较:

function(iterable){
  var unique = []

  for(var i=0; i< iterable.length; i++){
    if(unique.length < 1){
      unique.push(iterable[i])
    } else if(iterable[i] !== unique[unique.length - 1]) {
      unique.push(iterable[i])
    }
  }

  return unique
}

【讨论】:

    【解决方案3】:

    我认为这会对你有所帮助:

    var word="hhhhheeeelllloooooohhheeeyyy"
    function doit(iterable){
      var unique = []
      unique[0]=iterable[0]
      for(var i=1; i< iterable.length; i++){
         if(iterable[i] !== unique[unique.length - 1]) {
          unique.push(iterable[i])
        }
      }
      return unique
    }
    alert(doit(word))
    

    for 循环不会失败,因为 unique.length 是动态的,即会随着向数组中添加新元素而改变。

    也在 Internet Explorer 中测试过。 这是 jsfiddle 的链接:https://jsfiddle.net/kannanore/z5gbee55/

    【讨论】:

    • 我编辑了@K.Angel7 答案。已添加,unique.push(iterable[0])。
    【解决方案4】:
    var str = "hhhhheeeelllloooooohhheeeyyy";
    var strLen = str.length;
    var newStr = "";
    for(var i=0; i < strLen; i++ ){
        var chr$ = str.charAt(i);  
        //if(i==0) {newStr = chr$ };
        if(chr$ == str.charAt(i+1)){
            strLen = str.length;`enter code here`
        }else{
            newStr = newStr + chr$ ;
        }
    }
    //document.write(newStr);
    console.log(newStr);
    //Answer: helohey
    

    【讨论】:

    • 我应该返回一个数组。虽然,我有正确的解决方案,但我认为我应该指出它。
    猜你喜欢
    • 1970-01-01
    • 2019-09-02
    • 2017-10-27
    • 1970-01-01
    • 2018-09-28
    • 2014-03-31
    • 1970-01-01
    • 2017-10-02
    • 1970-01-01
    相关资源
    最近更新 更多