class Solution { public: int removeElement(vector<int>& nums, int val) { int Slow=0; for(int Fast=0;Fast<size(nums);Fast++) { if(nums[Fast]!=val){ nums[Slow]=nums[Fast]; Slow++; } }return Slow; } };
//题目描述:反转一个句子中的单词顺序,去除多余的空格。 /*思路: 1.先去除句子开头空格; 2.将多个空格缩减为一个空格。 3.去除结尾空格; 实现: 1.当是第一个下标,走; 2.快指针往前走,如果连续两个字符是空格,则跳出循环? */ #include<iostream> #include<string> using namespace std; class Solution { public: void removeExtraSpaces(string &s) { int Slow=0; int Fast=0; while(Fast==0&&s[Fast]==' ') {Fast++;} for(;Fast<size(s);Fast++) { if (s[Fast]==' '&&s[Fast-1]==' ') { continue;//跳过连续的空格 } else {s[Slow]=s[Fast]; Slow++; } } if(Slow-1>0&&s[Slow-1]==' ') {s.resize(Slow-1);} else {s.resize(Slow);} } void reverse(string & s,int start,int end){ int j; for(int i=start,j=end;i<j;i++,j--){ swap(s[i],s[j]); } } string reverseWords(string s) { removeExtraSpaces(s); reverse(s,0,size(s)-1); int start=0; for(int i=0;i<=size(s);++i) { if(i==size(s)||s[i]==' '){ reverse(s,start,i-1); start =i+1; } } return s; } }; int main(){ Solution sol; string s=" the sky is blue "; string result=sol.reverseWords(s); cout<<result<<endl; return 0; }
字符串总结:
反转一个单词--用头尾两个指针交换;
反转前k个单词-----增加了边界的判断;
反转字符串中的单词----去首尾和重复空格+整体反转+遇到空格反转单词。
找出字符串与给定字串第一个匹配字符的下标。
28. 找出字符串中第一个匹配项的下标 - 力扣(LeetCode)
题目描述:返回串中给定字串的第一个下标
暴力解法:
相当于我拿着一个needle框去对haystack进行比对。
class Solution {
public:
int strStr(string haystack, string needle) {
for (int i = 0; i < haystack.size(); i++) {
int j;
for (j=0; j < needle.size(); j++) {
if (i + j >= haystack.size() || haystack[i + j] != needle[j]) {
break;
}
}
if (j==needle.size())
return i;
}return -1;
}
给定一个字符串,判断其是否可由重复的字串构成。
暴力解法思路: (14号写吧)
浙公网安备 33010602011771号