LeetCode刷题Day6
LeetCode27. 移除元素(简单)
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
算法思想
双指针法: 通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。
- 快指针:寻找新数组的元素 ,新数组就是不含有目标元素的数组
- 慢指针:指向更新 新数组下标的位置
题中:i以查询原数组中不等于val的值用以组成新数组中,j指向新数组下一个元素的位置
代码实现
int removeElement(vector<int>& nums, int val) {
int i, j;
for(i=0,j=0; i<nums.size();i++){
if(nums[i] == val)
continue;
else{
nums[j] = nums[i];
j++;
}
}
return j;
}
反思总结
题目很简单,但是方法很重要
适用于多时间复杂度有限制的题目,可以将双层循环简化为一层循环,大大降低时间。
LeetCode 844. 比较含退格的字符串(简单)
给定 s 和 t 两个字符串,当它们分别被输入到空白的文本编辑器后,如果两者相等,返回 true 。# 代表退格字符。
输入:s = “ab#c”, t = “ad#c”
输出:true
解释:s 和 t 都会变成 “ac”。
算法思想
首先想到的是,如何遍历字符串?
- 下标访问,C++重载了 [] : s[i]
- 迭代器访问
string::iterator sit = s.begin(); //正向遍历
sit ++
string::reverse_iterator sit = s.rbegin(); //反向遍历
sit ++
算法
分别将s和t遍历,更新删掉退格#之后的字符串,再进行比较
代码实现
bool backspaceCompare(string s, string t) {
int i, j, ls, lt;
for(i=0,j=0; i<s.length(); i++){
if(s[i]=='#'){
if(j!=0) //如果此时#没有可退格的字母,则当作空白文本
j--;
}
else {
s[j] = s[i];
j++;
}
}
ls = j;
for(i=0,j=0; i<t.length(); i++){
if(t[i]=='#'){
if(j!=0)
j--;
}
else {
t[j] = t[i];
j++;
}
}
lt = j;
if(ls != lt) {
return false;
}
for(i=0,j=0; i<ls&&j<lt; i++,j++)
if(s[i] != t[j]){
return false;
}
return true;
}
错误改正
- 细节,判断是否为#时,没有给#加单引号
正确表达 :if (s[i] == '#')
- 粗心,最后比较时,忘记i++的同时也要j++
- 没有考虑到开头就是#的情况,增加下列代码:
if(s[i]=='#'){}
if(j!=0) //如果此时#没有可退格的字母,则当作空白文本
j--;
增加上诉代码后,忽略了else会自动与最近的if匹配
if(t[i]=='#')
if(j!=0)
j--;
else {
t[j] = t[i];
j++;
}
导致后面else的语句一直不能执行
改正
if(t[i]=='#'){
if(j!=0)
j--;
}
else {
t[j] = t[i];
j++;
}