Description

mplement the function unique_in_order which takes as argument a sequence and returns a list of items without any elements with the same value next to each other and preserving the original order of elements.

For example:

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]

Solutions

Julia

# Unique-In-Order.jl

"""
删除与前一个元素相同的元素
"""
#> "删除与前一个元素相同的元素\n"
function unique_in_order(arr)::Vector
    [x for (i, x)  enumerate(arr) if (i == 1 || x  arr[i-1])]
end
#> unique_in_order (generic function with 1 method)


unique_in_order([1, 2, 2, 3, 3, 3, 2])
#> 4-element Vector{Int64}:
#>  1
#>  2
#>  3
#>  2
unique_in_order("aabbccaa")
#> 4-element Vector{Char}:
#>  'a': ASCII/Unicode U+0061 (category Ll: Letter, lowercase)
#>  'b': ASCII/Unicode U+0062 (category Ll: Letter, lowercase)
#>  'c': ASCII/Unicode U+0063 (category Ll: Letter, lowercase)
#>  'a': ASCII/Unicode U+0061 (category Ll: Letter, lowercase)

R

# Unique-In-Order.R

library(tidyverse)


unique_in_order <- function(arr) {
    if (is.character(arr) && length(arr) == 1) {
        arr <- unlist(str_split(arr, ""))
    }

    output <- c()

    arr %>%
        walk(function(x) {
            if (length(output) == 0) {
                output <<- c(output, x)
            } else if (x != output[length(output)]) {
                output <<- c(output, x)
            }
        })

    output
}


unique_in_order(c(1, 2, 2, 3, 3, 3))
#> [1] 1 2 3
unique_in_order("aabbbccaa")
#> [1] "a" "b" "c" "a"

JavaScript

/**
 * @module Unique-In-Order
 */

/**
 * 只保留与前一项不同的项,组成新向量
 * @param {Iterable} iterable 
 * @returns {Iterable}
 */
function uniqueInOrder(iterable) {
    return [...iterable].filter((a, i) => a !== iterable[i - 1]);
    // index为-1时,返回undefined
};

console.log(uniqueInOrder('AAAABBBCCDAABBB'));
#> [ 'A', 'B', 'C', 'D', 'A', 'B' ]

Python

# Unique-In-Order.py

#%%
from itertools import groupby


def unique_in_order(iterable):
    return [k for (k, _) in groupby(iterable)]


unique_in_order([1, 2, 2, 3, 3])

# %%
#> [1, 2, 3]