每日一题

算法是程序的灵魂——佚名

(笔试题)

给定一个排序数组[1, 1, 2, 2, 2, 3, 3,3,3,4 ] 你需要原地删除重复出现的元素,使得每个元素仅出现一次,。请编写程序实现。

function remove(arr) {
    var newArr = [];
    newArr = [...arr];
    for (var i = 0; i < newArr.length - 1; i++) {
        if (newArr[i] == newArr[i + 1]) {
            newArr.remove(i);
            i--;
        }
    }
    return newArr;
}
var arr = [1, 1, 2, 2, 2, 3, 3, 3, 3, 4];
var result = remove(arr);
答案: B

该题目来源于工作中实际遇到的场景,比如根据用户状态变更记录,计算用户在线时长。

分析数组中数字的规律,题目的本质是删除数组中连续的重复项

这里给出两种实现方案(C#版本),Java,python的后续补充上):

public static List<int> allStates = new List<int> { 1, 1, 2, 2, 2, 3, 3,3,3,4 };

实现方案1(正向遍历):

public static List<UserUseState> Remove2(List<UserUseState> list)
        {
            List<UserUseState> newArr = list;
            for (var i = 0; i < newArr.Count - 1; i++)
            {
                if (i == 0)
                    continue;
                var currentItem = newArr[i];
                var nextItem = newArr[i + 1];

                if (currentItem.State == nextItem.State)
                {
                    newArr.Remove(nextItem);
                    i--;
                }
            }

            return newArr;
        }

实现方案2(反向遍历):

public static List<int> Remove3(List<int> list)
        {
            for (var i = 0; i < list.Count - 1; i++)
            {
                var currentItem = list[i];
                var nextItem = list[i + 1];

                if (currentItem == nextItem)
                {
                    list.Remove(currentItem);
                    i--;
                }
            }
            return list;
        }