目录
27.移除元素
var removeElement = function(nums, val) {
let i = 0
for (let j = 0; j < nums.length; j++) {
if (nums[j] !== val) {
nums[i++] = nums[j]
}
}
return i;
};
26.删除有序数组中的重复项
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int i = 1; //第一个元素肯定不重复 i直接从1开始
for (int j = 1; j < nums.size(); j++) {
if (nums[j] != nums[j-1]) {
nums[i++] = nums[j];
}
}
return i;
}
};
283.移动零
- 这题我最开始用的相向的双指针,结果发现输出的数组不按规定顺序,最后还是换成同向双指针
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int i = 0;
for (int j = 0; j < nums.size(); j++) {
if (nums[j] != 0) {
swap(nums[i], nums[j]);
i++;
}
}
}
};
844.比较含退格的字符串
- 最开始想的是用栈来一个个读写
class Solution {
public:
bool backspaceCompare(string s, string t) {
stack<char> S, T;
for (int i = 0; i < s.size(); i++) {
if (s[i] != '#') {
S.push(s[i]);
}
else if (!S.empty()) {
S.pop();
}
}
for (int i = 0; i < t.size(); i++) {
if (t[i] != '#') {
T.push(t[i]);
}
else if (!T.empty()) {
T.pop();
}
}
return S == T;
}
};
- 后来看题解才发现能用双指针(条件判断有点繁琐)
class Solution {
public:
bool backspaceCompare(string s, string t) {
int i = s.size() - 1, j = t.size() - 1;
int skipS = 0, skipT = 0;
while (i >= 0 || j >= 0) {
while (i >= 0) {
if (s[i] == '#') {
skipS++, i--;
}
else if (skipS > 0) {
skipS--, i--;
}
else break;
}
while (j >= 0) {
if (t[j] == '#') {
skipT++, j--;
}
else if (skipT > 0) {
skipT--, j--;
}
else break;
}
// 三种情况:
// 1、s和t未超界都找到对应字符,接下来判断是否相同不同 return false,相同继续搜索
// 2、s和t全超界,return true
// 3、s或t有一个超界(意味着另一个找到的字符没有配对成功) return flase
if (i >= 0 && j >= 0) {
if (s[i] != t[j]) return false;
}
else {
if (i >= 0 || j >= 0) return false;
}
i--, j--;
}
return true;
}
};
977.有序数组的平方
- 双指针分别位于原数组的头尾,比较绝对值大小决定传入哪个值
- 将值传入输出数组时从尾开始传
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
vector<int> ans(nums.size(),0);
int t = nums.size()-1;
for (int i = 0, j = nums.size()-1; i <= j;) {
if (abs(nums[i]) > abs(nums[j])) {
ans[t--] = nums[i]*nums[i];
i++;
}
else {
ans[t--] = nums[j]*nums[j];
j--;
}
}
return ans;
}
};