代码随想录算法训练营第8天 | 344.反转字符串、383.赎金信、15.三数之和、18.四数之和

目录

344.反转字符串

1.解题思路

2.我的实现

实现遇到的问题

代码

3.标准实现

区别

4.题目总结

1. 原地操作

2. 双指针法

541.反转字符串Ⅱ

1.解题思路

2.我的实现

实现遇到的问题

数组变成字符串:

continue 与 break 的区别

代码

3.标准实现

4.题目总结

逐段处理字符串

卡码网:54.替换数字(!!!)

1.解题思路

1. 遍历字符串

2. 判断字符类型

3. 使用 StringBuilder 构建结果字符串

2.我的实现

实现遇到的问题

StringBuilder的使用

toString() 方法

代码

3.标准实现

4.题目总结


344.反转字符串

题目链接:反转字符串

1.解题思路

题目中是必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题,所以不能用另外一个数组来接收,但是可以使用双指针,从两边交换,直到right>=left为止。

2.我的实现

实现遇到的问题

代码

public void reverseString(char[] s) {
        int left=0;
        int right=s.length-1;
        while (left<=right){
            char tmp=s[left];
            s[left]=s[right];
            s[right]=tmp;
            left++;
            right--;
        }
    }

3.标准实现

class Solution {
    public void reverseString(char[] s) {
        int l = 0;
        int r = s.length - 1;
        while (l < r) {
            s[l] ^= s[r];  //构造 a ^ b 的结果,并放在 a 中
            s[r] ^= s[l];  //将 a ^ b 这一结果再 ^ b ,存入b中,此时 b = a, a = a ^ b
            s[l] ^= s[r];  //a ^ b 的结果再 ^ a ,存入 a 中,此时 b = a, a = b 完成交换
            l++;
            r--;
        }
    }
}

// 第二种方法用temp来交换数值更多人容易理解些
class Solution {
    public void reverseString(char[] s) {
        int l = 0;
        int r = s.length - 1;
        while(l < r){
            char temp = s[l];
            s[l] = s[r];
            s[r] = temp;
            l++;
            r--;
        }
    }
}

区别

没区别

4.题目总结

1. 原地操作

  • 原地反转意味着不能创建新的数组来存储结果,必须在原数组上直接进行操作。这要求对空间的使用非常谨慎。

2. 双指针法

  • 使用双指针法是解决这类问题的最佳选择。一个指针从数组的起始位置开始,另一个指针从数组的末尾开始,两者向中间移动并交换元素,直到两个指针相遇。

541.反转字符串Ⅱ

题目链接:反转字符串Ⅱ

1.解题思路

遍历字符串的时候i+2k遍历,处理前k个,当不足k个时,再反转所有的,要用到上一题的反转函数,只是前面的反转函数会修改一下,多传个参数k。

2.我的实现

实现遇到的问题

数组变成字符串:

运用String.valueOf

String.valueOf 是一个多功能的方法,能够将各种类型的值转换为字符串表示。

// 基本类型转换为字符串
int num = 42;
String intStr = String.valueOf(num);  // "42"

// 字符数组转换为字符串
char[] charArray = {'J', 'a', 'v', 'a'};
String charArrayStr = String.valueOf(charArray);  // "Java"

// 对象转换为字符串
Object obj = new Object();
String objStr = String.valueOf(obj);  // obj.toString() 的结果

// 处理 null 对象
Object nullObj = null;
String nullStr = String.valueOf(nullObj);  // "null"
continuebreak 的区别
  • continue:跳过当前循环迭代,继续下一次迭代。
  • break:完全退出循环,不再进行后续迭代。

代码

 public void reverseString(char[] s,int j,int k) {
        int left=j;
        int right=k;
        while (left<=right-1){
            char tmp=s[left];
            s[left]=s[right-1];
            s[right-1]=tmp;
            left++;
            right--;
        }
    }
    public String reverseStr(String s, int k) {

        char[] res=s.toCharArray();
        for (int i = 0; i < res.length; i+=2*k) {

            if (i+k<=res.length){
                reverseString(res,i,i+k);
                continue;
            }
            reverseString(res,i,res.length);

        }
        return String.valueOf(res);
    }

3.标准实现

class Solution {
    public String reverseStr(String s, int k) {
        char[] ch = s.toCharArray();
        // 1. 每隔 2k 个字符的前 k 个字符进行反转
        for (int i = 0; i< ch.length; i += 2 * k) {
            // 2. 剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符
            if (i + k <= ch.length) {
                reverse(ch, i, i + k -1);
                continue;
            }
            // 3. 剩余字符少于 k 个,则将剩余字符全部反转
            reverse(ch, i, ch.length - 1);
        }
        return  new String(ch);

    }
    // 定义翻转函数
    public void reverse(char[] ch, int i, int j) {
    for (; i < j; i++, j--) {
        char temp  = ch[i];
        ch[i] = ch[j];
        ch[j] = temp;
    }

    }
}

4.题目总结

逐段处理字符串

  • 字符串按照 2k 字符一组进行处理,每组中的前 k 个字符需要被反转。
  • 需要处理字符串末尾的特殊情况,判断剩余字符的数量。
 // 2. 剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符
            if (i + k <= ch.length) {
                reverse(ch, i, i + k -1);
                continue;
            }
            // 3. 剩余字符少于 k 个,则将剩余字符全部反转
            reverse(ch, i, ch.length - 1);

卡码网:54.替换数字(!!!)

题目链接:替换数字

1.解题思路

1. 遍历字符串

  • 步骤
    • 遍历输入字符串的每一个字符。
    • 判断当前字符是字母还是数字。
      • 如果是字母:直接将该字符添加到结果字符串中。
      • 如果是数字:将字符串 "number" 添加到结果字符串中。

2. 判断字符类型

  • 可以使用 Character.isLetter() 方法来判断字符是否为字母。
  • 使用 Character.isDigit() 方法判断字符是否为数字。

3. 使用 StringBuilder 构建结果字符串

  • StringBuilder 是 Java 中用于高效地构建和修改字符串的类。
  • 在遍历过程中,将处理后的字符或字符串依次添加到 StringBuilder 中。
  • 最后,将 StringBuilder 转换为字符串得到结果。

2.我的实现

实现遇到的问题

StringBuilder的使用

StringBuilder 是 Java 中用于创建可变字符串的类。与 String 类不同,StringBuilder 的内容可以在原始对象中被修改,而 String 是不可变的,每次修改都会创建一个新的对象。因此,StringBuilder 在频繁修改字符串的场景下性能优于 String

toString() 方法
  • StringBuilder 转换为 String 对象。

代码

public class Thsz {
        public static String replaceDigits(String s) {
            if (s == null || s.isEmpty()) {
                return s; // 处理空字符串或null的情况
            }

            StringBuilder result = new StringBuilder();

            for (int i = 0; i < s.length(); i++) {
                char currentChar = s.charAt(i);

                if (Character.isDigit(currentChar)) {
                    result.append("number");
                } else {
                    result.append(currentChar);
                }
            }

            return result.toString();
        }
}

3.标准实现

import java.util.Scanner;

public class Main {
    
    public static String replaceNumber(String s) {
        int count = 0; // 统计数字的个数
        int sOldSize = s.length();
        for (int i = 0; i < s.length(); i++) {
            if(Character.isDigit(s.charAt(i))){
                count++;
            }
        }
        // 扩充字符串s的大小,也就是每个空格替换成"number"之后的大小
        char[] newS = new char[s.length() + count * 5];
        int sNewSize = newS.length;
        // 将旧字符串的内容填入新数组
        System.arraycopy(s.toCharArray(), 0, newS, 0, sOldSize);
        // 从后先前将空格替换为"number"
        for (int i = sNewSize - 1, j = sOldSize - 1; j < i; j--, i--) {
            if (!Character.isDigit(newS[j])) {
                newS[i] = newS[j];
            } else {
                newS[i] = 'r';
                newS[i - 1] = 'e';
                newS[i - 2] = 'b';
                newS[i - 3] = 'm';
                newS[i - 4] = 'u';
                newS[i - 5] = 'n';
                i -= 5;
            }
        }
        return new String(newS);
    };
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String s = scanner.next();
        System.out.println(replaceNumber(s));
        scanner.close();
    }
}

4.题目总结

  • 字符判断:使用 Character.isDigit(c) 来判断字符是否是数字,这样可以清晰地识别并替换数字字符。
  • 性能优化StringBuilder 是处理这种字符串拼接操作的最佳选择,因为它不会像 String 那样在每次修改时创建新的对象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值