Amber-Leedcode-Java-代码随想录打卡第八天|541. 反转字符串II● 卡码网:54.替换数字● 151.翻转字符串里的单词● 卡码网:55.右旋转字符串

 541. 反转字符串II

1.到底什么是stringbuilder?

使用双指针的写法,不过是小范围的指向一头一尾,需要注意的是swap的书写,要转换为stringbuilder才可以实现转换。

Amber-Leedcode-Java-代码随想录打卡第八天|541. 反转字符串II● 卡码网:54.替换数字● 151.翻转字符串里的单词● 卡码网:55.右旋转字符串_第1张图片

(来自代码随想录)

不过话说,到底什么是stringbuilder?

chat老师回答:

StringBuilder 是 Java 中的一个类,用于创建可修改的字符串。在 Java 中,字符串(String 类型)是不可变的,这意味着一旦创建了一个字符串,就不能更改它。每次对字符串进行修改(如拼接、替换字符等),实际上是在创建一个全新的字符串对象,这在处理大量字符串操作时会导致性能问题。

相比之下,StringBuilder 允许创建一个可变的字符串,可以在不创建新对象的情况下修改字符串。这在进行大量字符串操作时(如在循环中拼接字符串)非常有用,因为它可以显著提高性能。

2.stringbuilder的代码

1.创建:

StringBuilder sb = new StringBuilder(s);

2.转换回去:

s = sb.toString();

 3.swap怎么写:

char tmp = s.charAt(left);
        s.setCharAt(left, s.charAt(right));
        s.setCharAt(right, tmp);

 4.添加对象(扩展)

StringBuilder sb = new StringBuilder(); // 创建一个StringBuilder对象
sb.append("Hello "); // 向StringBuilder中添加字符串
sb.append("World"); // 再添加更多字符串

String result = sb.toString(); // 将StringBuilder转换为String
System.out.println(result); // 输出: Hello World

3.code 

class Solution {
    void swap(int left,int right, StringBuilder s){
        char tmp = s.charAt(left);
        s.setCharAt(left, s.charAt(right));
        s.setCharAt(right, tmp);
    } 
    public String reverseStr(String s, int k) {
        if (s.length() <= 1){
            return s;
        }
        int left = 0;
        int right;
        StringBuilder sb = new StringBuilder(s);
        int loop = s.length()/(2*k);
        for (int i = 1;i <= loop;i++){
            right = (i * 2 * k) - 1 - k;
            left = (i-1)*2*k;
            while(right > left){
                swap(left,right,sb);
                left++;
                right--;
        }
        }

        int remain = s.length() - loop*2*k;
        if (remain > k){
            left = loop*2*k;
            right = loop*2*k + k -1;
              while(right > left){
                swap(left,right,sb);
                left++;
                right--;
        }
        }else{
            left = loop*2*k;
            right = s.length() - 1;
            while(right > left){
                swap(left,right,sb);
                left++;
                right--;
        }

        }



        s = sb.toString();
        return s;
    }
}

卡码网:54.替换数字

直接抄的代码随想录的,感觉逻辑没有什么难的,就是代码的技术问题

1.值得注意,判断是否为数字的函数

Character.isDigit(s.charAt(i))

2.code 

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String s = in.nextLine();
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < s.length(); i++) {
            if (Character.isDigit(s.charAt(i))) {
                sb.append("number");
            }else sb.append(s.charAt(i));
        }
        System.out.println(sb);
    }
}

151.翻转字符串里的单词

 自己写出来啦,感觉不难

要求:不要使用辅助空间,空间复杂度要求为O(1)。

但是java无法办到,string不可修改。我使用的是双指针,从最后一位开始循环,感觉还挺方便的。

class Solution {
    public String reverseWords(String s) {

        int left = s.length() - 1;
        int right = s.length() - 1;
        StringBuilder result = new StringBuilder();
        boolean flag = false;

      while (left >= 0 ){
        while (left >= 0 && s.charAt(left) == ' '){
            left--;
            right--;
            flag = false;
        }
        while(left >= 0 && s.charAt(left) != ' '){
            left --;
            flag = true;
        }
        int tmp = left;
        left++;
        while (left <= right){
            result.append(s.charAt(left));
            left++;
        }
        if (tmp+1 != 0 ){
            result.append(' ');
        }
        if (flag == false){
            result.deleteCharAt(result.length() - 1);
        }
        left = tmp;
        right = tmp;
        }
        s = result.toString();
        return s;
    }
}

卡码网:55.右旋转字符串

自己写出来啦,感觉不难,嘻嘻

1.需要注意的点

读取两行的逻辑,这里确实不太熟问了c老师,注意换行的逻辑

Scanner in = new Scanner(System.in);
        int k = in.nextInt();
        in.nextLine(); // 读取换行符
        String s = in.nextLine();

 2.Code

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int k = in.nextInt();
        in.nextLine(); // 读取换行符
        String s = in.nextLine();
        StringBuilder sb = new StringBuilder();
        if (k > s.length()){
            System.out.println(s);
        }else if (k == s.length()){
            System.out.println(s);
        }
        int right = s.length() - k;
        int left = 0;
        int tmp = right;
        while (right < s.length()){
                sb.append(s.charAt(right));
                right++;
            }
        right = tmp;
        while (left < right){
            sb.append(s.charAt(left));
            left++;
        }
        s = sb.toString();
        System.out.println(s);
       
    }
}

总结:

  1. 状态:完结
  2. 学习2小时左右
  3. 困难:主要是stringbuilder的使用,掌握代码这个语言啊
  4. 待解决问题:暂无
  5. 今日收获:很多
  6. 来源:代码随想录

你可能感兴趣的:(leedcode,算法,数据结构,leetcode,java)