344. 反转字符串
这道题很简单,我们要反转字符串,很容易就想到用头尾两个指针来交换,代码如下。
java
class Solution {
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
这道题就稍微复杂一点,既然题目要求每计数至2k个字符再反转,那我们在for循环中让i一次+2k就行,我们要反转前k个,我们首先要确定i+k要小于s的长度,如果大于s的长度,则从i到s.length()-1,我们要把这一段去反转,反转的函数就可以用上面的题的代码。代码如下。
java
class Solution {
public String reverseStr(String s, int k) {
char[] arr=s.toCharArray();
for(int i=0;i<s.length();i+=2*k){
if(i+k<=s.length())
{
reverse(arr,i,i+k-1);
continue;
}
reverse(arr,i,s.length()-1);
}
return new String(arr);
}
public void reverse(char[] s,int left,int right) {
while(left<right){
char tmp=s[left];
s[left]=s[right];
s[right]=tmp;
left++;
right--;
}
}
}
151. 反转字符串中的单词
这道题就更复杂了,我们的做法是先把多余的空格消除,再将整串字符串倒置,最后把单词倒置。
例如:
1.hello world
2.hello world
3.dlrow olleh
4.world hello
就是以上的步骤。
消除空格:我们使用快慢指针的方法,在遍历时,如果fast不为空,且slow不是第一个字符时,我们就添加一个空格,代表单词前的一个空格,之后在fast小于数组长度且不为空的情况下,将fast的值赋给slow,部分代码如下。
java
int slow = 0;
for (int fast = 0; fast < n; fast++) {
if (arr[fast] != ' ') {
if (slow != 0)
arr[slow++] = ' ';
while (fast < n && arr[fast] != ' ') {
arr[slow++] = arr[fast++];
}
}
}
倒置字符串:这个就很简单,根据第一题就可以写出。
倒置单词:这个也比较简单,以空格为判断条件来倒置单词。全部代码如下。
java
class Solution {
public String reverseWords(String s) {
char[] arr = s.toCharArray();
int n = arr.length;
int slow = 0;
for (int fast = 0; fast < n; fast++) {
if (arr[fast] != ' ') {
if (slow != 0)
arr[slow++] = ' ';
while (fast < n && arr[fast] != ' ') {
arr[slow++] = arr[fast++];
}
}
}
reverse(arr, 0, slow - 1);
int start = 0;
for (int i = 0; i <= slow; i++) {
if (i == slow || arr[i] == ' ') {
reverse(arr, start, i - 1);
start = i + 1;
}
}
return new String(arr, 0, slow);
}
private void reverse(char[] arr, int left, int right) {
while (left < right) {
char tmp = arr[left];
arr[left] = arr[right];
arr[right] = tmp;
left++;
right--;
}
}
}