函数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]
答案 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)
提供两种不同的解决方案,具体取决于您的需求:
您可以将Set()
用于唯一集。只需将值添加到集合中,即可保留订单并阻止添加唯一值。
对于连续唯一集,您可以使用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;
}