Day9 字符串进阶
基础知识
常用 StringBuilder
API
append(String str)
:在此字符序列的末尾添加字符串。insert(int offset, String str)
:在指定位置插入字符串。delete(int start, int end)
:删除从指定起始位置到结束位置之间的字符。deleteCharAt(int index)
:删除指定位置的字符。reverse()
:将此字符序列进行反转。toString()
:将StringBuilder
对象转换为String
。setCharAt(int index, char ch)
:将指定位置的字符设置为指定的字符。charAt(int index)
:返回指定位置的字符。length()
:返回字符序列的长度。substring(int start, int end)
:返回从指定起始位置到结束位置之间的子字符串。
示例代码
public class StringBuilderExample {
public static void main(String[] args) {
// 创建一个 StringBuilder 实例
StringBuilder sb = new StringBuilder("Hello");
// append() 方法:在末尾添加字符串
sb.append(" World");
System.out.println("After append: " + sb.toString()); // 输出: "Hello World"
// insert() 方法:在指定位置插入字符串
sb.insert(5, " Java");
System.out.println("After insert: " + sb.toString()); // 输出: "Hello Java World"
// delete() 方法:删除指定范围的字符
sb.delete(5, 10);
System.out.println("After delete: " + sb.toString()); // 输出: "Hello World"
// deleteCharAt() 方法:删除指定位置的字符
sb.deleteCharAt(5);
System.out.println("After deleteCharAt: " + sb.toString()); // 输出: "HelloWorld"
// reverse() 方法:反转字符序列
sb.reverse();
System.out.println("After reverse: " + sb.toString()); // 输出: "dlroWolleH"
// toString() 方法:将 StringBuilder 转换为 String
String result = sb.toString();
System.out.println("Converted to String: " + result); // 输出: "dlroWolleH"
// setCharAt() 方法:设置指定位置的字符
sb.setCharAt(0, 'H');
System.out.println("After setCharAt: " + sb.toString()); // 输出: "HlroWolleH"
// charAt() 方法:获取指定位置的字符
char ch = sb.charAt(1);
System.out.println("Character at index 1: " + ch); // 输出: "l"
// length() 方法:获取字符序列的长度
int length = sb.length();
System.out.println("Length: " + length); // 输出: 10
// substring() 方法:获取指定范围的子字符串
String sub = sb.substring(0, 5);
System.out.println("Substring (0, 5): " + sub); // 输出: "HlroW"
}
}
解释
-
append(String str)
:- 将字符串
str
添加到StringBuilder
对象的末尾。
sb.append(" World"); // "Hello World"
- 将字符串
-
insert(int offset, String str)
:- 在指定位置
offset
插入字符串str
。
sb.insert(5, " Java"); // "Hello Java World"
- 在指定位置
-
delete(int start, int end)
:- 删除从
start
到end
之间的字符。
sb.delete(5, 10); // "Hello World"
- 删除从
-
deleteCharAt(int index)
:- 删除指定位置
index
的字符。
sb.deleteCharAt(5); // "HelloWorld"
- 删除指定位置
-
reverse()
:- 反转字符序列。
sb.reverse(); // "dlroWolleH"
-
toString()
:- 将
StringBuilder
对象转换为String
。
String result = sb.toString(); // "dlroWolleH"
- 将
-
setCharAt(int index, char ch)
:- 设置指定位置
index
的字符为ch
。
sb.setCharAt(0, 'H'); // "HlroWolleH"
- 设置指定位置
-
charAt(int index)
:- 获取指定位置
index
的字符。
char ch = sb.charAt(1); // 'l'
- 获取指定位置
-
length()
:- 获取字符序列的长度。
int length = sb.length(); // 10
-
substring(int start, int end)
:- 获取从
start
到end
之间的子字符串。
String sub = sb.substring(0, 5); // "HlroW"
- 获取从
题目
梳理
第一遍用的Java内置的分割之类的api,虽然很简单,但是用时和内存都是垫底的,所以看完了题解,再敲一遍。
主要思路:
- 先去除首尾的空格,去除行内的多余空格
- 翻转整个字符串
- 翻转单个的单词,调用第二步的函数
优化前:
优化后:
注意这种需要循环移位的最好是从后向前遍历,否则可能会出错。
代码
151
class Solution {
public String reverseWords(String s) {
StringBuilder sb = MyTrim(s);
MyReverse(sb,0,sb.length() - 1);
MyEachWord(sb);
return sb.toString();
}
//去除首位空格和多余的空格
private StringBuilder MyTrim(String s){
int start = 0;
int end = s.length() - 1;
//去除首尾的空格
while(s.charAt(start) == ' ')start++;
while(s.charAt(end) == ' ')end--;
StringBuilder sb = new StringBuilder();
while(start <= end){
char c = s.charAt(start);
//去除多余的空格
// 1.该字符本身是空格
// 2.该字符是空格,前一个不是空格
if(c != ' ' || sb.charAt(sb.length() - 1) != ' '){
sb.append(c);
}
start++;
}
return sb;
}
//翻转完整的字符串
private void MyReverse(StringBuilder sb,int start,int end){
while(start < end){
char temp = sb.charAt(start);
sb.setCharAt(start,sb.charAt(end));
sb.setCharAt(end,temp);
start++;end--;
}
}
//翻转每一个单词
private void MyEachWord(StringBuilder sb){
int start = 0;
int end = 1;
int n = sb.length();
while(start < n){
while(end < n && sb.charAt(end) != ' '){
end++;
}
MyReverse(sb,start,end - 1);
start = end + 1;
end = start +1;
}
}
}
卡码网55
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// 读取整数 n
int n = sc.nextInt();
sc.nextLine(); // 消费换行符
// 读取字符串并创建 StringBuilder
StringBuilder sb = new StringBuilder(sc.nextLine());
// 取余数以减少旋转次数
n = n % sb.length();
// 旋转字符串
while (n > 0) {
char tmp = sb.charAt(sb.length() - 1);
for (int i = sb.length() - 1; i > 0; i--) {
sb.setCharAt(i, sb.charAt(i - 1));
}
sb.setCharAt(0, tmp);
n--;
}
// 打印结果
System.out.println(sb.toString());
}
}