27、反转字符串里的单词
题目简介:
给你一个字符串 s
,请你反转字符串中 单词 的顺序。
单词 是由非空格字符组成的字符串。s
中使用至少一个空格将字符串中的 单词 分隔开。
返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。
**注意:**输入字符串 s
中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。
初见思路:
我的想法是,先要把每一个单词都提取出来,然后存进一个vector里,然后再按倒序给他放进去就好了。一个vector里能够存string嘛。
算法思路:
失败,失大败,败者食尘。
1、第一步要进行删除多余的空格。
我觉得我还是不清楚删除字符串的精髓。慢指针和快指针的变化规律,已经每次变换之后两个指针的位置关系。我一直不理解为什么慢指针能空出来一来,原来快指针和慢指针在遇见空格的时候是一起停在这个空格这里的。
所以,当快指针接着往前走,然后遇见非空格时,慢指针可以先把自己设置成空格,然后再往前走一格,然后正常进循环复制快指针的内容。
class Solution {
public:
void erase(string& s) {
int n = s.size();
int fast = 0;
int slow = 0;
for ( ; fast < n; fast++){
if (s[fast] != ' '){
if (slow != 0){
s[slow] = ' ';
slow++;
}
while(fast < n && s[fast] != ' ') {
s[slow++] = s[fast++];
}
}else {
}
}
s.resize(slow);
}
void reverse(string& s,int start,int end){
int left=start;
int right=end-1;
while(right > left){
swap(s[left],s[right]);
left++;
right--;
}
}
string reverseWords(string s) {
erase(s);
reverse(s,0,s.size());
int start=0;
for(int i =0;i<=s.size();i++){
if(s[i] == ' ' || i == s.size()){
reverse(s,start,i);
start=i+1;
}
}
return s;
}
};
28、右旋字符串
题目简介:
字符串的右旋转操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串s
和一个正整数 k
,请编写一个函数,将字符串中的后面 k 个字符移到字符串的前面,实现字符串的右旋转操作。
例如,对于输入字符串 "abcdefg"
和整数 2,函数应该将其转换为 "fgabcde"
。
初见思路:
我有一个天才的想法,我可以循环把第一个和n-k索引的元素进行循环交换,这样就可以实现右旋了。我是天才!
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main(){
int k;
cin >> k;
string temp;
cin >> temp;
int n = temp.size();
int index = n-k;
int left =0;
int right = n;
while(left < right-1){
while(index < n){
swap(temp[left],temp[index]);
left++;
index++;
}
index = n-k;
}
for(auto a : temp){
cout<<a;
}
return 0;
}
算法思路:
算法的思路还是整体反转,然后再局部反转的思路,我觉得和27
题其实是很类似的。我试试看能不能写出来。
#include <iostream>
#include <vector>
#include <string>
using namespace std;
void reverse(string& s ,int start,int end){
int left=start;
int right = end-1;
while(left <right){
swap(s[left] , s[right]);
left++;
right--;
}
}
int main(){
int k;
cin >> k;
string temp;
cin >> temp;
int n = temp.size();
reverse(temp,0,n);
reverse(temp,0,k);
reverse(temp,k,n);
for(auto a:temp){
cout<<a;
}
return 0;
}
嗯嗯,非常流畅!
29、实现strSTR()
题目简介:
给你两个字符串 haystack
和 needle
,请你在 haystack
字符串中找出 needle
字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle
不是 haystack
的一部分,则返回 -1
。
初见思路:
我的思路就是一个个匹配,先找到第一个匹配的,然后循环检索其他字母是否匹配。记录起始索引,如果后续匹配不成功,我再返回索引继续往后走。但是我觉得我实现的很没有美感,我觉得这个问题肯定不是像我这么写的,这样很繁琐我觉得,明天看看思路吧,今天好晚了。
class Solution {
public:
int strStr(string haystack, string needle) {
int n = haystack.size();
int m = needle.size();
int i = 0;
while (i < n) {
if (haystack[i] == needle[0]) {
int count = 1;
int start=0;
int index = i;
while (haystack[i] == needle[start] && start < m) {
if (count == m ) {
return index;
}
count++;
start++;
i++;
}
i=index;
}
i++;
}
return -1;
}
};
来不及看剩下的了,救命,火速先补一补,明天补!