您的位置:首页 > 其它

笔试题39. LeetCode OJ (26)

2016-04-26 17:31 190 查看


这个题目的意思是给你一个数组,删除里面重复的数字,然后返回数组的长度。第一反应是它很简单,不过还是调试了几次才写出来的,确实是一个循环就能解决的问题,不过我觉得其中还是需要注意一下东西:

1.先找到第一次出现相同的位置,这样方便解题(我是按照我下面的代码来说明的,当然你可能会有别的方法)

2.遇到相同元素时,记录第一次出现的位置prev,然后找到不是这个元素时停止,将这个元素加入到不重复序列中

3.想一想还有这样一种情况,就是前面有一些元素不同,但是突然出现了相同元素,这个时候需要注意代码的控制,否则最后的结果可能会出现重复的数字,我们应该将这个特殊数字加入到不重复序列后,再移动cur,使其和前面的序列不重复为止。

综上,代码如下:

class Solution {
public:
int removeDuplicates(vector<int>& nums)
{
/*
1.不准备额外使用空间
2.返回删除重复节点后的数组长度
3.数组有序
*/
int len = nums.size();
if(len == 0 || len == 1)
{
return len;
}
int only = 0; // 用于记录不重复的下标,最后该下标以及以前的部分都是only one
int prev = 0;
int cur = 1;  //用于遍历

//找出前面不相同的序列
while(cur<len && nums[only] != nums[cur])
{
++cur;
++only;
}
if(cur == len)
{
return only+1;
}

while(cur < len)
{
if(nums[cur] == nums[cur-1])
{
prev = cur-1;
while(cur<len && nums[prev] == nums[cur])
{
++cur;
}
nums[only++] = nums[prev];
}
else
{
nums[only++] = nums[cur++];
while(cur < len && nums[cur] == nums[cur-1])
{
++cur;
}
}
}

return only;
}
};


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: