目录
344.反转字符串
思路:双指针,左右交换
541.反转字符串II
题目:541. 反转字符串 II - 力扣(LeetCode)
视频讲解:字符串操作进阶! | LeetCode:541. 反转字符串II_哔哩哔哩_bilibili
思路:遍历计数,每次达到2k,就用反转字符串的方式,反转前k个字符,怎么知道有2k个了呢?主要是这里传进来的是String,我能不能先存在一个char[ ]里面,之后转换为String返回出去。
- 我想的是count记录遍历了多少次2k,用于给left和right添加偏移量
- cur计算遍历次数,每2k次重置
- 通过while循环,反转前k个字符
尝试
class Solution {
public String reverseStr(String s, int k) {
char[] result = new char[s.length()];
int cur = 0;
int count =0;
for(int i=0;i<s.length();i++){
cur++;
if(cur==2*k){
int left = 0 + 2*k*count;
int right = k-1 + 2*k*count;
while(left<right){
result[left] = s.charAt(right);
result[right] = s.charAt(left);
right--;
left++;
if(right==left){
result[right] = s.charAt(right);
}
}
count++;
cur=0;
}
}
String str = new String(result);
return str;
}
}
题解
class Solution {
public String reverseStr(String s, int k) {
char[] result = s.toCharArray();
int n = s.length();
for(int i=0;i<n;i+=2*k){
int left = i;
int right = Math.min(i + k - 1,n-1);
while(left<right){
char temp = result[left];
result[left++] = result[right];
result[right--] = temp;
}
}
return new String(result);
}
}
收获
- 将字符串转换为字符数组:char[] result = s.toCharArray();
- 每计数2k就反转字符,可以通过【i += 2 * k】实现
- 字符数组转换为String:new String(result),直接通过new的方式就能实现
54.替换数字
题目:54. 替换数字(第八期模拟笔试) (kamacoder.com)
思路:
- 把所有数字用特殊字符‘#’替换掉,打印的时候,遇到#就输出number
- 不知道要怎么用卡码网
- 不知道有没有函数能直接判断字符是否为数字
尝试
import
class soultion(){
public static void main (String[] args) {
/* code */
char[] result = s.toCharArray();
int length = s.length();
for(int i=0;i<s.length();i++){
if(result[i]不是字符){
result[i] = '#';
}
}
for(char i :result){
if(i=='#'){
System.out.print("number");
}else{
System.out.print(i);
}
}
}
}
收获
- 题目理解错了!题目要求是返回字符串来的
- Character.isDigit——判断字符是否为数字
- Scanner in = new Scanner(System.in)——读取用户输入
- String s = in.nextLine()——读取用户输入的一行字符串,存入到变量中
- StringBuilder用append来添加内容
151.反转字符串里的单词
题目:151. 反转字符串中的单词 - 力扣(LeetCode)
思路:
- 双指针,先去掉前导、尾随空格,存入新的String
- 从尾部开始扫描,遇到空格就把该单词存入数组,并加上空格
- 通过s的长度判断最后一个单词,如果是最后一个单词,就不加空格
- 把数组转换为String类型返回
尝试
class Solution {
public String reverseWords(String s) {
StringBuilder result = new StringBuilder();
int n = s.length();
int left = 0;
int right = n-1;
for(int i =0;i<n;i++){
while(left<right){
if(s.charAt(left)==' '){
left++;
}
if(s.charAt(right)==' '){
right--;
}
}
}
for(int i=0;i<right-left;i++){
#我想的是,从尾部开始遍历,遍历到空格,就把当前位置到上一个空格的字符appen进result里
#所以,还需要一个指针定在末尾,存入单词后,该指针指向当前位置,当前的right接着往回走
while(right>left){
if(s.charAt(right)==' '){
}
right--;
}
}
}
}
题解
class Solution {
public String reverseWords(String s) {
// 1.去除首尾以及中间多余空格
StringBuilder sb = removeSpace(s);
// 2.反转整个字符串
reverseString(sb, 0, sb.length() - 1);
// 3.反转各个单词
reverseEachWord(sb);
return sb.toString();
}
private StringBuilder removeSpace(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);
if (c != ' ' || sb.charAt(sb.length() - 1) != ' ') {
sb.append(c);
}
start++;
}
return sb;
}
/**
* 反转字符串指定区间[start, end]的字符
*/
public void reverseString(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 reverseEachWord(StringBuilder sb) {
int start = 0;
int end = 1;
int n = sb.length();
while (start < n) {
while (end < n && sb.charAt(end) != ' ') {
end++;
}
reverseString(sb, start, end - 1);
start = end + 1;
end = start + 1;
}
}
}
收获
- 双指针移除数组元素的方法给忘了,应该是慢指针当作写指针,快指针遍历整个数组。
- 思路:去除首尾以及中间多余空格——>反转整个字符串——>反转各个单词
- 去除多余空格
- 双指针,先把字符串两端的空格删掉
- 通过StringBuilder接收字符,当前字符不是空格 || 当前StringBuilder最后一位不是空格,就接着append
- 反转字符串指定区间[start, end]的字符
- 传入StringBuilder,start,end
- 通过setCharAt(start, sb.charAt(end)),交换指定位置的字符
- 反转每个单词
- 遍历整个StringBuilder
- 只要快指针没有到尾,且快指针指向的不是空格
- 调用reverString函数
- 慢指针指向快指针的后一个位置,因为此时快指针指向的是空格
- 快指针指向慢指针后一个位置
右旋转字符串
题目:55. 右旋字符串(第八期模拟笔试) (kamacoder.com)
思路:for循环,用Stringbuilder,前n-k个字符往后挪k个位置,先把后面的append进去Stringbuilder,再append前面的
尝试(AC)
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int k = in.nextInt(); // 使用nextInt()读取整数
in.nextLine(); // 消耗掉nextInt()留下的换行符
String s = in.nextLine();
StringBuilder sb = new StringBuilder();
int n = s.length();
int count = k;
// 反转前k个字符
for (int i = 0; i < k; i++) {
sb.append(s.charAt(n -count ));
count--;
}
// 追加剩余的字符串
for (int i = 0; i < n-k; i++) {
sb.append(s.charAt(i));
}
System.out.println(sb.toString());
}
}
收获
- 异或法交换两个数的值(关键:一个值如果连续异或同一个值两次,会还原为原始值。)
- start ^= end :(start = start ^ end)
- end ^= start : (end = end ^start = end ^ start ^ end = start)
- start ^= end :(start = start^end = end ^ start ^ start = end)
这篇博客总结了LeetCode中涉及字符串操作的题目,包括344.反转字符串、541.反转字符串II、54.替换数字、151.反转字符串里的单词和右旋转字符串。博主分享了不同题目的解题思路,如双指针法、字符数组转换、遍历计数等,并提到了关键的编程技巧,如Character.isDigit、StringBuilder和异或法交换数值。
1099

被折叠的 条评论
为什么被折叠?



