344. 反转字符串
思路: 双指针法
public void ReverseString(char[] s) {
int left = 0;
int right = s.Length-1;
while (left < right)
{
char tmp = s[left];
s[left] = s[right];
s[right] = tmp;
left++;
right--;
}
}
541.反转字符串II
public static string ReverseStr(string s, int k)
{
char[] data = s.ToCharArray();
for (int i = 0; i < s.Length; i += 2 * k)//间隔2k
{
if (i + k <= s.Length) ReverseString(data, i, i + k - 1);
else ReverseString(data, i, s.Length-1);
}
return new string(data);//char[] to string
}
public static void ReverseString(char[] s, int startIdx, int endIdx)
{
while (startIdx < endIdx)
{
char tmp = s[startIdx];
s[startIdx] = s[endIdx];
s[endIdx] = tmp;
startIdx++;
endIdx--;
}
}
剑指 Offer 05. 替换空格
思路:
public static string ReplaceSpace(string s)
{
int len = 0;
for (int i = 0; i < s.Length; i++)
{
if (s[i] == ' ')
{
len += 3;
}
else {
len++;
}
}
char[] data = new char[len];
for (int i = len - 1, j = s.Length - 1; i >= 0; i--,j--)
{
if (s[j] == ' ')
{
data[i] = '0';
data[i - 1] = '2';
data[i - 2] = '%';
i = i - 2;
}
else
{
data[i] = s[j];
}
}
return new string(data);
}
151. 反转字符串中的单词
思路:
- 快慢指针移除多余空格
- 将整个字符串反转
- 将每个单词反转
举个例子,源字符串为:" the sky is blue "
- 移除多余空格 : “the sky is blue”
- 字符串反转:“eulb si yks eht”
- 单词反转:“blue is sky the”
public static string ReverseWords(string s)
{
char[] data = s.ToArray();
int fast = 0, slow = 0;
for (; fast < data.Length; fast++)//去除所有空格并在相邻单词之间添加空格, 快慢指针。
{
if (data[fast] != ' ')
{
if(slow > 0) data[slow++] = ' ';//手动控制空格,给单词之间添加空格。slow > 0说明不是第一个单词,需要在单词前添加空格。
while (fast < data.Length && data[fast] != ' ')
{
data[slow++] = data[fast++];
}
}
}
char[] data1 = new char[slow];//slow的大小即为去除多余空格后的大小。
for (int i = 0; i < data1.Length; i++)
{
data1[i] = data[i];
}
ReverseString(data1, 0, data1.Length - 1);//先整体反转,再局部反转
int startIdx = 0;
for (int i = 0; i <= data1.Length; i++)
{
if (i == data1.Length || data1[i] == ' ')//到达空格或者串尾,说明一个单词结束。进行翻转。
{
ReverseString(data1, startIdx, i - 1);//翻转,注意是左闭右闭 []的翻转。
startIdx = i + 1;//更新下一个单词的开始下标start
}
}
return new string(data1);
}
public static void ReverseString(char[] s, int startIdx, int endIdx)
{
while (startIdx < endIdx)
{
char tmp = s[startIdx];
s[startIdx] = s[endIdx];
s[endIdx] = tmp;
startIdx++;
endIdx--;
}
}
剑指 Offer 58 - II. 左旋转字符串
思路: 先局部反转,再整体反转
public static string ReverseLeftWords(string s, int n)
{
char[] data = s.ToCharArray();
ReverseString(data, 0, n - 1);
ReverseString(data, n, data.Length - 1);
ReverseString(data, 0, data.Length - 1);
return new string(data);
}
public static void ReverseString(char[] s, int startIdx, int endIdx)
{
while (startIdx < endIdx)
{
char tmp = s[startIdx];
s[startIdx] = s[endIdx];
s[endIdx] = tmp;
startIdx++;
endIdx--;
}
}