从输入中删除所有相邻的重复字符

时间:2017-03-27 23:04:44

标签: javascript arrays unique

函数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]

2 个答案:

答案 0 :(得分: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]));

答案 1 :(得分:0)

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

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

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

    • 如果参数是字符串,则通过拆分空字符串(.split(''))来创建此数组
    • 迭代输入值数组时,可以将当前值与之前的值进行比较;如果它们不同,则返回true
    • true响应将包含您将根据过滤器创建的数组中的值(包含您的唯一值)
  3. 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;
    }