翻转字符串中的单词 力扣151
思路
- 双指针移除多余空格 并手动添加单词间空格
代码
-
void removeSpaces(string& s) //移除多余空格 { int slow =0; for(int i=0;i<s.size();i++) { if(s[i]!=' ') { if(slow!=0) //如果s[i]不为空 则前面是空 所以给中间的slow附上单词间的空格 { s[slow++]=' '; } while(s[i]!=' '&& i<s.size())//赋值 s[slow++]=s[i++]; //slow++了 } } s.resize(slow); //此时slow =slow+1 } void reverse(string &s) //反转字符串(左闭右闭) { for (int i = start, j = end; i < j; i++, j--) { swap(s[i], s[j]); } } string reversewords(stirng s) //主函数 { removeSpaces(s);//先去空格 reverse(s,0,s.size()-1);//后翻转 int start=0; for(int i=0;i<s.size();i++) //找到每个单词 单个单词反转 { if(i==s.size()||s[i]==' ') //单个单词的结尾 { reverse(s,start,i-1);//反转单个单词 start=i+1; } } } return s;
反转字符串 力扣344
代码
-
//str ij双指针 for(int i=0,int j=str.size()-1;i<str.size()/2;i++,j--) //ij同时移动向中间 { swap(str[i],str[j]); } return str;
反转字符串II 力扣541
思路
- 输入k 字符串中前k个反转 后k个不变 再k个反转 ….
代码
-
//输入k 字符串 for(int i=0;i<s.size();i+=2k) //i一次走2k 作为起始字符下标 { if(i+k<=s.size()) { reverse(s,i,i+k); //编译器库函数 一般默认是左闭右开的 continue; } reverse(s,i,s.size()); // 所以不包含以i+k / s.size() 为下标的元素 } return s;
四数之和 力扣24
思路
-
target 可能>0可能<0
-
k i left right 四指针
-
外层k循环 里层i循环(三数之和的模式) left right移动
-
剪枝操作k要做 i也要做
代码
-
//target目标值 vector<vector<int>> result; sort(nums.begin(),nums.end()); for(int k=0;k<nums.size();k++) { if(nums[k]>target&& nums[k]>=0) //k剪枝 { break; } if(k>0&& nums[k]==nums[k-1]) //k去重 { continue; } for(int i=0;i<nums.size();i++) { if((nums[k]+nums[i])>target&& nums[k] + nums[i] >= 0) //i剪枝 { break; } if (i > k + 1 && nums[i] == nums[i - 1]) //i去重 { continue; } int left = i + 1; //接下来和三数之和一样 int right =nums.size()-1; while (right > left) { if ((long) nums[k] + nums[i] + nums[left] + nums[right] > target) { right--; //需要转换成long类型的 否则可能溢出 } else if ((long) nums[k] + nums[i] + nums[left] + nums[right] < target) { left++; } else{ result.push_back(vector<int>{nums[k], nums[i], nums[left], nums[right]}); while (right > left && nums[right] == nums[right - 1]) right--; while (right > left && nums[left] == nums[left + 1]) left++;//双指针去重 right--; left++; //同时收缩 } } return result;
用队列实现栈 力扣225
思路
- 用一个队列 模拟
- 弹出除最后一个元素的所有元素 再重新查回队列
代码
-
queue<int>que; void push(int x) { que.push(x); } int pop() { int size=que.size(); size--; while(size--) //循环把前面元素插到后面 { que.push(que.front()); que.pop(); } int result =que.front(); que.pop(); return result; } int top() { return que.back(); } bool empty() { return que.empty(); }
用栈模拟队列 力扣232
思路
-
一个出栈 一个入栈
代码
-
//入栈 stackin 出栈 stackout void push(int x) { stackin.push(x); } int pop() //int 类型的返回值 { if(stackout.empty()) { while(!stackin.empty()) { stackout.push(stackin.top); stackin.pop(); } } int result =stackout.top(); stackout.pop(); } int peek() { int res=this->pop(); stackout.push(res); return res;//查询第一个元素 但是不删除 所以重新插回去 } bool empty() { return stackin.empty()&& stackout.empty(); }