目录
151. 反转字符串中的单词
题目链接:
题目要求:
给你一个字符串 s
,请你反转字符串中 单词 的顺序。
单词 是由非空格字符组成的字符串。s
中使用至少一个空格将字符串中的 单词 分隔开。
返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。
注意:输入字符串 s
中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。
题目用例:
示例 1:
输入:s = "the sky is blue
" 输出:"blue is sky the
"
示例 2:
输入:s = " hello world " 输出:"world hello" 解释:反转后的字符串中不能存在前导空格和尾随空格。
示例 3:
输入:s = "a good example" 输出:"example good a" 解释:如果两个单词间有多余的空格,反转后的字符串需要将单词间的空格减少到仅有一个。
提示:
1 <= s.length <= 104
s
包含英文大小写字母、数字和空格' '
s
中 至少存在一个 单词
实现思路:
1.去除字符串两端的空格,并将多个连续空格替换为一个。
2.使用空格分割字符串得到单词数组。
3.反转单词数组(使用首尾指针或双指针法)。
4.使用StringBuilder来拼接反转后的单词数组,并在单词之间添加单个空格(注意不要在第一个单词前添加空格)。
5.将StringBuilder对象转换为字符串并返回。
实现代码:
class Solution {
/* 给你一个字符串 s ,请你反转字符串中 单词 的顺序。
单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。
返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。
注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。
返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。*/
public String reverseWords(String s) {
// 去除字符串两端的空格,并将多个连续空格替换为一个
s = s.trim().replaceAll("\\s+", " ");
// 使用空格分割字符串得到单词数组
String[] words = s.split(" ");
//定义首尾指针
int start = 0;
int end = words.length - 1;
for (int i=0;i<words.length/2;i++) {
String tmp = words[start];
words[start] = words[end];
words[end] = tmp;
start++;
end--;
}
StringBuilder builder = new StringBuilder();
for (int i = 0; i < words.length; i++) {
if(i>0)builder.append(" ");
builder.append(words[i]);
}
return builder.toString();
}
}
测试代码:
public class Test {
public static void main(String[] args) {
/* 示例 1:
输入:s = "
the sky is blue
"
输出:"
blue is sky the
"
示例 2:
输入:s = " hello world "
输出:"world hello"
解释:反转后的字符串中不能存在前导空格和尾随空格。
示例 3:
输入:s = "a good example"
输出:"example good a"
解释:如果两个单词间有多余的空格,反转后的字符串需要将单词间的空格减少到仅有一个。*/
Solution solution = new Solution();
//示例1:
String s1=" the sky is blue ";
System.out.println(solution.reverseWords(s1));
//示例2:
String s2=" hello world ";
System.out.println(solution.reverseWords(s2));
//示例3:
String s3="a good example";
System.out.println(solution.reverseWords(s3));
}
}
55. 右旋字符串
题目链接:
55. 右旋字符串(第八期模拟笔试) (kamacoder.com)
题目要求:
字符串的右旋转操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串 s 和一个正整数 k,请编写一个函数,将字符串中的后面 k 个字符移到字符串的前面,实现字符串的右旋转操作。
例如,对于输入字符串 "abcdefg" 和整数 2,函数应该将其转换为 "fgabcde"。
实现思路:
1.计算实际移动数量:通过取k对字符串长度s.length()的模(k % s.length()),以确保k表示的是有效的字符移动数量。
2.创建字符数组和StringBuilder:
3.将后k个字符追加到StringBuilder:
使用一个循环,从charArray.length - k开始,到charArray.length - 1结束(包括这两个索引),将字符追加到str中。
将剩余字符追加到StringBuilder:
4.使用另一个循环,从0开始,到charArray.length - k - 1结束(包括这个索引),将字符追加到str中。
5.输出结果:将str转换为字符串(通过调用str.toString()),并打印到控制台。
实现代码:
import java.util.Scanner;
class Main {
/* 字符串的右旋转操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串 s 和一个正整数 k,
请编写一个函数,将字符串中的后面 k 个字符移到字符串的前面,实现字符串的右旋转操作。
例如,对于输入字符串 "abcdefg" 和整数 2,函数应该将其转换为 "fgabcde"。*/
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int k = sc.nextInt();
String s = sc.next();
solve(k,s);
}
public static void solve(int k,String s) {
// 如果k大于字符串长度,取模得到实际要移动的字符数
k = k % s.length();
char[] charArray = s.toCharArray();
StringBuilder str = new StringBuilder();
// 追加字符串s的后k个字符到StringBuilder中
for (int i = charArray.length-k; i < charArray.length; i++) {
str.append(charArray[i]);
}
// 追加字符串s的前(s.length() - k)个字符到StringBuilder中
for (int i = 0; i < charArray.length-k; i++) {
str.append(charArray[i]);
}
System.out.println(str.toString());
}
}