● 344.反转字符串
class Solution {
public:
void reverseString(vector<char>& s) {
int l =s.size();
int i=0,j=l-1;
for(;i<=j;)
{
int m;
m=s[i];
s[i]=s[j];
s[j]=m;
i++;j--;
}
}
};
我这个写的很麻烦,正常用swap(left[i],right[j])
就直接换位了。
● 541. 反转字符串II
思路就是套用了很复杂的循环,然后循环不出去了
【错误】
class Solution {
public:
string reverseStr(string s, int k) {
int l= s.size();
int i=1,j=l-1;
int m,n=2*k+1;
for(m=0;;m++)
{
if(m==2*k)
{
for(;i<=k;)
{
swap(s[i],s[m]);
i++;
m--;
}
}
if(j-n+1<k)
{
for(;n<=j;)
{
swap(s[n],s[j]);
n++;
j--;}
}
else if((j-n+1<2*k)&&(j-n+1>=k))
{
int p=j-n+1;j=p+k;
for(;p<=j;)
{
swap(s[p],s[j]);
p++;
j--;}
}
}
}
};
class Solution {
public:
string reverseStr(string s, int k) {
int n = s.length();
for (int i = 0; i < n; i += 2 * k) {
reverse(s.begin() + i, s.begin() + min(i + k, n));
}
return s;
}
};
reverse(s.begin() + i, s.begin() + min(i + k, n));这是一个将字符串 s 中从索引 i 开始的连续 k 个字符进行反转的函数调用。它使用了 C++ 的 reverse 函数,将字符串中的指定范围进行反转。s.begin() + i 表示从索引 i 开始的迭代器,s.begin() + min(i + k, n) 表示从索引 i 加上 k 和字符串长度 n 中的较小值的迭代器。这个函数调用会将该范围内的字符顺序反转。
reverse是反转,swap是交换位置。
for (int i = 0; i < n; i += 2 * k) {
reverse(s.begin() + i, s.begin() + min(i + k, n));
}
min(i + 2, n)这个是怕不断的加倍之后超出字符串长度
当k=2时, for (int i = 0; i < n; i =i+4) {
reverse(s.begin() + i, s.begin() + min(i + 2, n));
}
比如这个字符串是abcd,
s.begin() + i=a,
s.begin() + min(i + 2, n)=c,
那换的不是把abcd变成cbad吗?
这样做为啥还能判断剩余字符啊?
它就没判断什么剩不剩余字符 ,它直接把一个字符串分很多段,还是不懂。。。
● 剑指Offer 05.替换空格
因为数组只能覆盖,所以1换多要多郑一个数组,建立一个新数组s,使用函数s.push_back(’ ')就可以把字符加到里面了。
● 151.翻转字符串里的单词
问题是,倒着输出如何能保证单词的顺序是正确的。
s = “the sky is blue”
class Solution {
public:
string reverseWords(string s) {
// 反转整个字符串
reverse(s.begin(), s.end());//eulb si yks eht这一步是让blue这个单词到最前面
int n = s.size();
int idx = 0;
for (int start = 0; start < n; ++start) {
if (s[start] != ' ') {
// 填一个空白字符然后将idx移动到下一个单词的开头位置
if (idx != 0) s[idx++] = ' ';
// 循环遍历至单词的末尾
int end = start;
while (end < n && s[end] != ' ') s[idx++] = s[end++];
// 反转整个单词
reverse(s.begin() + idx - (end - start), s.begin() + idx);
// 更新start,去找下一个单词
start = end;
}
}
s.erase(s.begin() + idx, s.end());
return s;
}
};
【自己写滴】
class Solution {
public:
string reverseWords(string s) {
string a,b;
int i=0;
int l=s.size();//15
reverse(s.begin(),s.end());//eulb si yks eht
for(;i<l;)
{
if(s[i]==' ')//
{
reverse(a.begin(),a.end());//blue
b=b+a;
i++;
while(s[i]==' ')
{i++;}
a="";
if(i<l)
if(b!="")//判断空格是不是在第一个字符上,如果在第一个字符上,忽略
{b.push_back(' ');}
}
else
{
a.push_back(s[i]);
i++;
}
if(i==l)//因为最后一个单词没有空格,所以需要直接加
{
reverse(a.begin(),a.end());
b=b+a;
}
}
return b;
}
};
● 剑指Offer58-II.左旋转字符串(最后一道加油!)
一遍过,很简单。我想到的就是切片,把一个字符串分成两个字符串,然后交换顺序。
另一种方式是用一个字符串先遍历后边的部分,再遍历前面的部分。