【问题标题】:Remove all adjacent repeating characters from input从输入中删除所有相邻的重复字符
【发布时间】:2017-03-27 23:04:44
【问题描述】:

unique_in_order 函数将序列作为参数并返回一个项目列表,其中没有任何具有相同值的元素彼此相邻并保留元素的原始顺序。

例如:

uniqueInOrder('AAAABBBCCDAABBB') == ['A', 'B', 'C', 'D', 'A', 'B'] 
uniqueInOrder('ABBCcAD') == ['A', 'B', 'C', 'c', 'A', 'D'] 
uniqueInOrder([1,2,2,3,3]) == [1,2,3]

【问题讨论】:

  • 请分享您的代码。
  • @Kinduser 现在我有????
  • @Kinduser“方式不同”?他在问如何从数组中删除重复项。仅仅是它是一个字符串的事实吗?因为这也有很多重复。
  • @Kinduser 或者你没有解释你的代码是如何工作的事实......我相信我之前在你的答案中提到过不止一个......

标签: javascript arrays unique


【解决方案1】:

您首先要做的是将输入标准化,这样无论是字符串还是数组,都无关紧要。

const input = Array.isArray(x) ? x : x.split('');

在上述之后,输入将始终是一个数组。现在跳过的逻辑是重复的很简单

for (let i = 0; i < input.length; ++i) {
  if (input[i] == input[i + 1]) continue
  result.push(input[i])
}

continue,即跳过输入中与每个索引的下一个相同的每个索引。然后对于每个不重复的元素,您将其推入结果数组。

整个过程是这样的:

function uniqueInOrder(x) {
  const result = [];
  const input = Array.isArray(x) ? x : x.split('');

  for (let i = 0; i < input.length; ++i) {
    if (input[i] == input[i + 1]) continue
    result.push(input[i])
  }
  
  return result
}

console.log(uniqueInOrder('AAAABBBCCDAABBB'));
console.log(uniqueInOrder('ABBCcAD'));
console.log(uniqueInOrder([1, 2, 2, 3, 3]));

如果您熟悉 filter 函数,您可以将其设为单行。

function uniqueInOrder(x) {
  return (Array.isArray(x) ? x : x.split(''))
    .filter((c, i) => c !== x[i + 1]);
}

console.log(uniqueInOrder('AAAABBBCCDAABBB'));
console.log(uniqueInOrder('ABBCcAD'));
console.log(uniqueInOrder([1, 2, 2, 3, 3]));

【讨论】:

    【解决方案2】:

    提供两种不同的解决方案,具体取决于您的需求:

    1. 您可以将Set() 用于唯一集。只需将值添加到集合中即可保留顺序并防止添加唯一值。

    2. 对于连续唯一的集合,您可以使用filter 来迭代数组。

      • 如果参数是字符串,则通过在空白字符串上拆分创建此数组 (.split(''))
      • 在对输入值数组进行迭代时,可以将当前值与前一个值进行比较;如果它们不同,则返回true
      • true 响应将包含您将作为 过滤器(保存您的唯一值)的结果创建的数组中的值

    uniqueInOrder('AAAABBBCCDAABBB') == ['A', 'B', 'C', 'D', 'A', 'B']
    uniqueInOrder('ABBCcAD') == ['A', 'B', 'C', 'c', 'A', 'D']
    uniqueInOrder([1, 2, 2, 3, 3]) == [1, 2, 3]
    
    
    
    function unique(input) {
      var set = new Set(),
        arr = input;
        
      if (typeof input == 'string')
        arr = arr.split('');
    
      arr.forEach(val => {
        set.add(val)
      });
    
      console.log('input:',input);
      console.log('unique:',[...set]);
      return [...set];
    }
    
    function uniqueInOrder(input) {
      var arr = input;
      if (typeof input == 'string')
        arr = arr.split('');
    
      var unique = arr.filter((val,i,arr)=>{
        return val !== arr[i-1];
      });
    
      console.log('input:', JSON.stringify(input));
      console.log('uniqueInOrder:', JSON.stringify(unique));
      return unique;
    }

    【讨论】:

    • @Kinduser 我认为您的用户名不太准确。此外,如果您想谈论过度复杂化,那么您在任何地方对[...str] 的使用都一样糟糕,甚至更糟,因为它会将您的算法变成O(n^2) 之一。
    • @Kinduser 因为仅仅发布工作代码并不意味着您正确回答了问题。如果你想要一个合理的批评,你的代码最初的运行时间很差,现在你已经修复了,但你仍然没有真正解释它。此外,你的 cmets 也不是很愉快。也许尝试从这个问题中休息一下?你看起来很沮丧。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-05
    • 2015-01-05
    • 1970-01-01
    • 1970-01-01
    • 2021-08-04
    • 2021-07-03
    相关资源
    最近更新 更多