Leetcode:从排序数组(JavaScript)中删除重复项

时间:2018-11-22 06:58:17

标签: javascript algorithm

为什么我的解决方案可以在控制台中工作,但不能在leetcode上工作?

var removeDuplicates = function(nums) {
    let res = [];     
    for(let num of nums) {
        if(res.includes(num) === false) {
            res.push(num);
        }
    }   
    return res.length;
};

控制台: screenshot

邮政编码:

let arr = [1, 1, 2]

removeDuplicates(arr) // 3 

3 个答案:

答案 0 :(得分:1)

您可以尝试将includes更改为indexOf,可能是由于includes在您的环境中不起作用。另外,您应该返回length而不是返回res

只要您想尝试另一种方法,就可以像下面这样查看Sets

var removeDuplicates = function(nums) {
    return [...new Set(nums)]
};

console.log(removeDuplicates([1,1,2]))

console.log(removeDuplicates([1,1,2,3]))

答案 1 :(得分:0)

您没有正确使用分类。从算法上来说,将项目与先前的项目进行比较会更有效,因此复杂度为O(N)

也许JS具有诸如Python groupby之类的高阶函数可以使代码更短,但是从算法的角度来看,所描述的方法绝对是最好的方法。

ideone

var removeDuplicates = function(nums) {
    let res = []; 
    let last = NaN
    for(i=0; i<nums.length; i++) {
        if(nums[i] != last) {
            res.push(nums[i]);
            last = nums[i];
        }
    }   
    return res.length;
};

let arr = [1, 1, 2]
print(removeDuplicates(arr)) 

>>2

答案 2 :(得分:0)

这是您可以尝试的另一种解决方案...

void Awake()
{
    Load();
}

void OnApplicationQuit()
{
    Save();
}

void OnApplicationFocus(bool hasFocus)
{
    if (hasFocus) Load();
    else Save();
}

void Load()
{
    long nowTicks = DateTime.UtcNow.Ticks;
    long prevTicks = nowTicks;

    string prevTicksString = PlayerPrefs.GetString("ticks", string.Empty);
    if (!string.IsNullOrEmpty(prevTicksString)) prevTicks = long.Parse(prevTicksString);

    double secondsPassed = TimeSpan.FromTicks(nowTicks - prevTicks).TotalSeconds;

    Debug.Log(secondsPassed);
}

void Save()
{
    PlayerPrefs.SetString("ticks", DateTime.UtcNow.Ticks.ToString());
    PlayerPrefs.Save();
}

Click here to RUN