这是我参与2022首次更文挑战的第10天,活动详情查看:2022首次更文挑战
双指针的巩固训练第三天
反转字符串
该题出自力扣的344题 — 反转字符串【简单题】
审题
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。 不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
- 题意相对简单,就是把一个字符串里面的字符反转,并且不需要开辟额外的空间
- 根据题意,使用双指针实现
- 直接一个while循环,指针指向字符串的首尾字符
- 字符对调
- 指针相对移动,直到指针碰撞为止
编码
public void reverseString(char[] s) {
int n = s.length,left =0,right = n -1;
while(right>left){
char c = s[left];
s[left] = s[right];
s[right] = c;
left++;
right--;
}
}
反转字符串的单词III
该题出自力扣的557题 —— 反转字符串的单词III【简单题】
审题
给定一个字符串
s,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。
- 此题与上一题的区别在于,上一题是简单反转一个字符串;而这一题是反转一串字符串所组成的字符串。
- 需要注意的点是,字符串内需要用空格 隔来
- 也是使用双指针的方式解决
- 先用String的split方法分割字符串
- for循环对于每个数组拆分
- 延续上题解法,对每个字符串操作
- 最后用一个for循环遍历,用StringBuilder的append方法去拼接
编码
public String reverseWords(String s) {
String[] a = s.split(" ");
for (int i = 0;i<a.length;i++){
char[] c = a[i].toCharArray();
int n = c.length,left =0,right = n -1;
while(right>left){
char temp = c[left];
c[left] = c[right];
c[right] = temp;
left++;
right--;
}
a[i] = String.valueOf(c);
}
StringBuilder sb = new StringBuilder();
for(int i =0;i<a.length;i++){
if (i == a.length - 1){
sb.append(a[i]);
break;
}
sb.append(a[i]);
sb.append(" ");
}
return sb.toString();
}