前一阵去西藏玩了,停更了几天,现在接着续更。
照例先上题目
题目要求原地修改数组,采用快慢指针法,快指针用于遍历数组,慢指针用于记录有效元素后一位。满指针和快指针之间的元素为有效元素。
起始时,快指针和慢指针都指向第一个元素。在遍历时每当快指针所指元素为val时,说明该元素要被移除,所以快指针向后移,将该元素置于快指针和慢指针之间。当快指针所指元素不为val时,要将该元素置于慢指针之前,所以将快指针的元素放置在慢指针处,慢指针和快指针均向后移。
附上代码:
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int p = 0, q = 0;
int n = nums.size();
for (; p < nums.size(); p++) {
if (nums[p] != val) {
if (p != q){
int temp = nums[q];
nums[q++] = nums[p];
nums[p] = temp;
}else
++q;
}else
--n;
}
return n;
}
};
代码可以精简一下:
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int p = 0, q = 0;
for (; p < nums.size(); p++) {
if (nums[p] != val) {
if (p != q)
nums[q] = nums[p];
++q;
}
}
return q;
}
};
还可以再精简一下!!
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int p = 0, q = 0;
for (; p < nums.size(); p++) {
if (nums[p] != val) {
nums[q++] = nums[p];
}
}
return q;
}
};
希望自己的代码风格能越来越精简规范。