一、问题描述
给定一个排过序的数组,将他们重复的元素移到最后(标准库中unique的效果),返回不重复元素的个数
例子:给定一个数组{1,1,2},将数组变为{1,2,1},返回值为2
二、问题解决
思路还是很简单,记录两个位置,第一个位置向前遍历,每次遇到不等的数就将他位置的数移到后一个位置上,然后前后位置加1,直到前一个位置遍历完整个数组。
int removeDuplicates(vector<int>& nums) { if (nums.size() == NULL) return 0; int num = nums.at(0); int pos = 1; for (int i = 1; i < nums.size(); i++) { while (i < nums.size() && nums.at(i) == num) i++; if (i == nums.size()) return pos; if (i != pos) nums.at(pos) = nums.at(i); pos++; num = nums.at(i); } return pos; } int main() { vector<int> v = {1,1}; cout << removeDuplicates(v) << endl; system("pause"); return 0; }
上面的代码还是很繁琐,不容易看出逻辑。Leetcode里面讨论有一个很简洁的实现,可以看一波
public int removeDuplicates(int[] nums) { if (nums.length == 0) return 0; int i = 0; for (int j = 1; j < nums.length; j++) { if (nums[j] != nums[i]) { i++; nums[i] = nums[j]; } } return i + 1; }
代码简洁,思路清晰,比我的好得多,且边界条件好想到。