题目描述:(. - 力扣(LeetCode))
思路1:栈处理
-
如果它是退格符,那么我们将栈顶弹出;
-
如果它是普通字符,那么我们将其压入栈中。
leetcode官方解答:
class Solution {
public:
bool backspaceCompare(string S, string T) {
return build(S) == build(T);
}
string build(string str) {
string ret;
for (char ch : str) {
if (ch != '#') {
ret.push_back(ch);
} else if (!ret.empty()) {
ret.pop_back();
}
}
return ret;
}
};
思路2:双指针:
快慢指针,快指针++,遇到非‘#’---->low++,说明符合要求,遇到‘#’,要考虑low是否为0,low--
分别处理两个字符串即可
class Solution {
public:
bool backspaceCompare(string s, string t) {
int len_s = s.size();
int len_t = t.size();
int low1 = 0;
for (int fast = 0; fast < len_s; fast++) {
if(s[fast] != '#') {
s[low1++] = s[fast];
}else if(low1 > 0) {
low1--;
}
}
int low2 = 0;
for (int fast = 0; fast < len_t; fast++) {
if(t[fast] != '#') {
t[low2++] = t[fast];
}else if(low2 > 0){
low2--;
}
}
//判断
if( low1 != low2) return false;//这里也要注意
for (int i = 0;i < low1 && i < low2; i++) {
if(s[i] != t[i]) return false;
}
return true;
}
};
题目描述:(. - 力扣(LeetCode))
思路:
一开始想的是直接原地平方再排序,后面排序时间开销至少要(nlogn)
后来发现数组是递增排序的,平方后就打乱了
而且最大的元素只能在左右端出现,双指针思路就有了。
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int len = nums.size();
int i = 0;
int j = len - 1;
int k = len - 1;
vector<int> res(len,0);
while (i <= j) {
if (nums[i]*nums[i] > nums[j]*nums[j]) {
res[k--] = nums[i]*nums[i];
i++;
}
else {
res[k--] = nums[j]*nums[j];
j--;
}
}
return res;
}
};