跟着代码随想录刷题的第八天。
代码随想录链接:代码随想录
part01 翻转字符串里的单词
题目链接:151.翻转字符串里的单词
代码:
class Solution {
public String reverseWords(String s) {
// 将字符串转换为字符数组,方便后续操作
char[] ch = s.toCharArray();
// 去除多余的空格
int slow = removeExtraSpaces(ch);
// 反转整个字符数组
reverse(ch, 0, slow - 1);
// 反转每个单词
int start = 0;
for (int i = 0; i <= slow; i++) {
// 当遇到空格或者到达数组末尾时,反转当前单词
if (i == slow || ch[i] == ' ') {
reverse(ch, start, i - 1);
start = i + 1;
}
}
// 将处理好的字符数组转换为字符串
return new String(ch, 0, slow);
}
// 去除字符串中多余的空格,只保留单词间一个空格
private int removeExtraSpaces(char[] ch) {
int slow = 0;
for (int i = 0; i < ch.length; i++) {
// 跳过开头的空格
if (ch[i] != ' ') {
// 如果不是第一个单词,在单词前添加一个空格
if (slow != 0) {
ch[slow++] = ' ';
}
// 将单词复制到新位置
while (i < ch.length && ch[i] != ' ') {
ch[slow++] = ch[i++];
}
}
}
return slow;
}
// 反转字符数组中从 start 到 end 的字符
private void reverse(char[] ch, int start, int end) {
char tmp;
while (start < end) {
tmp = ch[start];
ch[start] = ch[end];
ch[end] = tmp;
start++;
end--;
}
}
}
题解:该题没有调用java中自带的分割字符串的函数。该题是将字符串中的多余空格先去掉,再整体翻转字符串,最后根据空格做间隔符,分别翻转每个单词。
part02 右旋转字符串
题目链接:55.右旋转字符串
代码:
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
int k = scanner.nextInt();
String s = scanner.next();
char[] ch = s.toCharArray();
int len = s.length()-1;
reverse(ch,0,len);
reverse(ch,0,k-1);
reverse(ch,k,len);
System.out.println(ch);
}
private static void reverse(char[] ch,int start,int end){
char tmp;
while(start<end)
{
tmp = ch[start];
ch[start] = ch[end];
ch[end] = tmp;
start++;
end--;
}
}
}
题解:这道题与上道题有异曲同工之妙。即翻转整个字符串,再翻转前k个字符,后剩下的字符。