代码随想录刷题Day9字符串进阶(力扣151,卡码网55)

Day9 字符串进阶


基础知识

常用 StringBuilder API

  1. append(String str):在此字符序列的末尾添加字符串。
  2. insert(int offset, String str):在指定位置插入字符串。
  3. delete(int start, int end):删除从指定起始位置到结束位置之间的字符。
  4. deleteCharAt(int index):删除指定位置的字符。
  5. reverse():将此字符序列进行反转。
  6. toString():将 StringBuilder 对象转换为 String
  7. setCharAt(int index, char ch):将指定位置的字符设置为指定的字符。
  8. charAt(int index):返回指定位置的字符。
  9. length():返回字符序列的长度。
  10. 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"
    }
}

解释

  1. append(String str)

    • 将字符串 str 添加到 StringBuilder 对象的末尾。
    sb.append(" World"); // "Hello World"
    
  2. insert(int offset, String str)

    • 在指定位置 offset 插入字符串 str
    sb.insert(5, " Java"); // "Hello Java World"
    
  3. delete(int start, int end)

    • 删除从 startend 之间的字符。
    sb.delete(5, 10); // "Hello World"
    
  4. deleteCharAt(int index)

    • 删除指定位置 index 的字符。
    sb.deleteCharAt(5); // "HelloWorld"
    
  5. reverse()

    • 反转字符序列。
    sb.reverse(); // "dlroWolleH"
    
  6. toString()

    • StringBuilder 对象转换为 String
    String result = sb.toString(); // "dlroWolleH"
    
  7. setCharAt(int index, char ch)

    • 设置指定位置 index 的字符为 ch
    sb.setCharAt(0, 'H'); // "HlroWolleH"
    
  8. charAt(int index)

    • 获取指定位置 index 的字符。
    char ch = sb.charAt(1); // 'l'
    
  9. length()

    • 获取字符序列的长度。
    int length = sb.length(); // 10
    
  10. substring(int start, int end)

    • 获取从 startend 之间的子字符串。
    String sub = sb.substring(0, 5); // "HlroW"
    

题目

梳理

image-20240715162522395

第一遍用的Java内置的分割之类的api,虽然很简单,但是用时和内存都是垫底的,所以看完了题解,再敲一遍。

主要思路:

  • 先去除首尾的空格,去除行内的多余空格
  • 翻转整个字符串
  • 翻转单个的单词,调用第二步的函数

优化前:

660366838d02d6e90609a84577fb8c9

优化后:

5c4f1fe840d3bce9ef3a6afc63c8a2f

image-20240715164647182

注意这种需要循环移位的最好是从后向前遍历,否则可能会出错。

代码

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());
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值