代码随想录算法训练营第八天 | 字符串

我报名参加金石计划1期挑战——瓜分10万奖池,这是我的第n篇文章,点击查看活动详情

前言

今天开始算法进入字符串专项练习,今日任务:

344. 反转字符串

题目描述

image.png

思路分析

这个类似于双指针, 两个元素交换

代码展示

public static void reverseString(char[] s) {
    for (int i = 0; i < s.length / 2; i++) {
        char temp = s[i];
        s[i] = s[s.length - i  - 1];
        s[s.length - i  - 1] = temp;
    }
}

提交记录

image.png

541. 反转字符串 II

题目描述

image.png

思路分析

先对每 2k个数按照要求进行反转, 然后在判断最后几个数要反转的下标, 按要求进行反转

代码展示

public static String reverseStr(String s, int k) {
    char[] chars = s.toCharArray();
    int left = 0, right = 2 * k;
    while(right < s.length()){
        int m = left + k - 1;
        while(left < m){
            char temp = chars[left];
            chars[left++] = chars[m];
            chars[m--] = temp;
        }
        left = right;
        right += 2*k;
    }
    right =  s.length() - left < k ? s.length() - 1: left + k - 1;
    while(left < right){
        char temp = chars[left];
        chars[left++] = chars[right];
        chars[right--] = temp;
    }
    return String.valueOf(chars);
}

提交结果

image.png

剑指 Offer 05. 替换空格

题目描述

image.png

思路分析

  • 遍历字符串
  • 每个字符串是否为 空格
  • 如果为空格则替换为 %20
  • 使用 StringBuilder,因为要进行多次的字符串修改操作

代码展示

public static String replaceSpace(String s) {
    char[] chars = s.toCharArray();
    StringBuilder str = new StringBuilder();
    for (char aChar : chars) {
        if(aChar == ' '){
            str.append("%20");
        }else{
            str.append(aChar);
        }
    }
    return str.toString();
}

提交结果

image.png

151. 反转字符串中的单词

题目描述

image.png

思路分析

简单来说就是遍历字符串保存每一个单词,然后倒序输出就可以了

注意事项:

  • 字符串以空格开头
  • 字符串以空格结尾
  • 每两个单词中间存在多个空格

代码展示

public static String reverseWords(String s) {
    StringBuilder str = new StringBuilder();
    char[] chars = s.toCharArray();
    Stack<String> stack = new Stack<>();
    for (char aChar : chars) {
        if (aChar == ' '){
            if (!str.toString().equals("")){
                stack.push(str.toString());
                str = new StringBuilder();
            }
        }else{
            str.append(aChar);
        }
    }
    if (!"".equals(str.toString())){
        stack.push(str.toString());
    }
    str = new StringBuilder();
    while(!stack.isEmpty()){
        str.append(stack.pop());
        str.append(' ');
    }
    return str.deleteCharAt(str.length() - 1).toString();
}

提交记录

image.png

总结

可以看到,这道题每一次都会出现错误,每一次都是在细节的问题上,希望有一天做题能够考虑的更加周到

剑指 Offer 58 - II. 左旋转字符串

题目描述

image.png

思路分析

还是遍历字符串,根据 n来当做分界值,先遍历 >=n的值,在遍历 <n的值

【代码展示】中分别是上次提交和本次提交的代码, 咱也不知道为啥上次写的那么麻烦, 但是确实是执行用时会少一点,毕竟是在同一个字符串内进行操作,但是代码量会多很多,内存消耗差不多

代码展示

上次代码

public String reverseLeftWords(String s, int n) {
    char[] chars = s.toCharArray();
    int length = chars.length;
    int t = n;
    for (int i = 0; i <  n; i++) {
        n--;
        char temp = chars[i];
        chars[i] = chars[n];
        chars[n] = temp;
    }
    for (int i = t; i < length; i++) {
        char temp = chars[i];
        chars[i] = chars[length - 1];
        chars[length - 1] = temp;
        length--;
    }
    length = chars.length;
    for (int i = 0; i < length; i++) {
        char temp = chars[i];
        chars[i] = chars[length - 1];
        chars[length - 1] = temp;
        length--;
    }
    return String.valueOf(chars);
}

本次代码

public static String reverseLeftWords(String s, int n) {
    char[] chars = s.toCharArray();
    StringBuilder str = new StringBuilder();
    for (int i = n; i < chars.length; i++) {
        str.append(chars[i]);
    }
    for (int i = 0; i < n; i++) {
        str.append(chars[i]);
    }
    return str.toString();
}

提交结果

image.png

总结

字符串专项练习截止到目前依旧是拿捏,根据目前的练习,字符串方面主要还是以遍历为主,依托于遍历来进行的各种其他操作




本文内容到此结束了

如有收获欢迎点赞👍收藏💖关注✔️,您的鼓励是我最大的动力。

如有错误❌疑问💬欢迎各位大佬指出。

我是 宁轩 , 我们下次再见