一、344 翻转字符串
这个题目比较简单,字符串两头对调就可以。
void reverseString(char* s, int sSize) {
int i = 0;
int j = sSize - 1;
while(i < j)
{
char tmp = s[j];
s[j] = s[i];
s[i] = tmp;
i++;
j--;
}
}
二、541 翻转字符串II
1 每隔2k个字符,前面k个字符翻转,后面k个字符不翻转;
2 如果后面字符[0, k]区间,那么全部翻转,如果[k, 2k],那么重复上面1的操作。
所以本题目主要判断翻转区间: if(len > k + i) ,区间落在了[k 2k],否则落在了[0 k].
void reverse(char* s, int start, int end) {
for(; start < end; start++, end--)
{
char tmp = s[start];
s[start] = s[end];
s[end] = tmp;
}
}
char* reverseStr(char* s, int k) {
for(int i = 0; i < strlen(s); i += (2 * k))
{
/**如果剩余字符在区间[k, 2k],只是翻转前面K个字符**/
if(k + i <= strlen(s))
{
reverse(s, i, k + i - 1);
}
else
{
/**如果剩余字符在区间[0, k], 全部翻转**/
reverse(s, i, strlen(s) -1);
}
}
return s;
}
三、151.翻转字符串里的单词
本题目需要解决字符串里面的空字符,利用双指针法,将字符串内部不符合的空字符处理。具体思路如下:slow =0,初始化index,当字符不为空,填入s[slow], slow++,这里需要注意,单词之间是有空格的,所以每遍历一个单词,需要加入空格。
void reverse(char* s, int start, int end) {
for(; start < end; start++, end--)
{
char tmp = s[start];
s[start] = s[end];
s[end] = tmp;
}
}
char* reverseWords(char* s) {
//处理空格
int slow = 0;
for(int i = 0; i < strlen(s); i++)
{
if(s[i] != ' ')
{
if(slow != 0)
{
s[slow++] = ' ';
}
while(s[i] != ' ' && (i < strlen(s)))
{
s[slow++] = s[i++];
}
}
}
if(slow < strlen(s))
{
s[slow] = '\0';//字符串补充一个结束字符
}
reverse(s, 0, slow -1);
int pos = 0;
for(int j = 0; j <= slow; j++)
{
if(s[j] == ' ' || j == slow)
{
reverse(s, pos, j - 1);
pos = j + 1;
}
}
return s;
}