代码随想录算法训练营第9天

151.反转字符串中的单词

题目链接:151. 反转字符串中的单词 - 力扣(LeetCode)

视频链接:代码随想录 (programmercarl.com)

第一想法

使用split函数然后倒序相加

代码随想录想法

先去除空格,再将整个字符串反转,再将单个单词反转

去除空格

如果时间复杂度为O(n)的话,新new StringBuilder sb追加加字符即可。既要判断非空格字符原样追加又要保证单词间距一个空格的距离的逻辑是

if(s.charAt(start)!=' '||sb.charAt(sb.length()-1)!=' ')//如果当前字符不为空或者已追加新单词后没有空格
    sb.append(s.charAt(start));

代码

class Solution {
    public String reverseWords(String s) {
        //去除空格
        StringBuilder sb =  RemoveSpace(s);
        //反转整个字符串
        reverseWholeWord(sb,0,sb.length()-1);
        //反转单个字符串
        ReverseSingleWord(sb);
        //返回
        return sb.toString();
    }
    public StringBuilder RemoveSpace(String s){
        int start = 0;
        int end = s.length() - 1;
        StringBuilder sb = new StringBuilder();
        while (s.charAt(start)==' ')start++;//去除前导空字符
        while (s.charAt(end)==' ')end--;//去除后导空字符
        while (start<=end){
            if(s.charAt(start)!=' '||sb.charAt(sb.length()-1)!=' ')//如果当前字符不为空或者已追加新单词后没有空格
                sb.append(s.charAt(start));
            start++;
        }
        return sb;
    }
    public void reverseWholeWord(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--;
        }
    }
    public void ReverseSingleWord(StringBuilder sb){
        int start = 0;
        int end = 1;
        while (start < sb.length()) {
            while (end<sb.length()&&sb.charAt(end)!=' ')
                end++;
            reverseWholeWord(sb,start,end-1);
            start = end + 1;
            end = start + 1;
        }
    }
}
class Solution2 {
    public String reverseWords(String s) {
        char[] oldCharArray = s.toCharArray();
        char[] newCharArray = new char[oldCharArray.length];
        int newIndex = 0;
        int i = oldCharArray.length - 1;
        while (i>=0){
            while (i>=0&&oldCharArray[i]==' ')i--;//去除末尾空格,循环结束时,i指向第一个非空格元素
            int right = i;//设定右边界
            while (i>=0&&oldCharArray[i]!=' ')i--;//跳过一个单词,循环结束时,i指向该元素的左边界。首元素则指向-1,非首元素则指向前面的空格
            //单独获取一个单词的边界[i+1,right];
            for(int j = i+1;j<=right;j++){
                newCharArray[newIndex++] = oldCharArray[j];
                if(j==right)//如果抵达右边界,则末尾加一个空格
                    newCharArray[newIndex++] = ' ';
            }
        }
        if(newIndex == 0) return "";
        else return new String(newCharArray,0,newIndex - 1);
    }
}

卡码网55.右旋字符串

题目链接:55. 右旋字符串(第八期模拟笔试) (kamacoder.com)

文档/视频链接:代码随想录 (programmercarl.com)

第一想法

定义双端队列,右端出n个元素加入到左端。但是这样做就没意义了。

或者先将整个字符串反转,分别将子字符串反转回来。

假设字符串为"abcdefg" ,n = 2

先反转整体"gfedcba",

再反转局部:[0,n-1],变成 fg edcba;

                      [n,length -1]变成 fg abcde

代码随想录想法

看了感觉和第一想法差不多。

代码

class Solution2{
    public String RightReverse(String s,int n){
        char[] charArray = s.toCharArray();
        //先反转整体的
        Reverse(charArray,0,charArray.length-1);
        //再反转局部
        Reverse(charArray,0,n-1);
        Reverse(charArray,n,charArray.length-1);
        return new String(charArray);
    }
    public void Reverse(char[] s, int start,int end){
        while (start<end){
            char temp = s[start];
            s[start] = s[end];
            s[end] = temp;
            start++;
            end--;
        }
    }
}

KMP留到以后补吧,今天就暂且不看了。

相关推荐

  1. 代码随想算法训练9

    2024-07-12 03:56:01       26 阅读
  2. 代码随想算法训练 | 字符串

    2024-07-12 03:56:01       57 阅读
  3. 代码随想算法训练17

    2024-07-12 03:56:01       57 阅读
  4. 代码随想算法训练16

    2024-07-12 03:56:01       36 阅读
  5. 代码随想算法训练|

    2024-07-12 03:56:01       25 阅读
  6. 代码随想算法训练28|回溯

    2024-07-12 03:56:01       28 阅读
  7. 代码随想算法训练30|回溯

    2024-07-12 03:56:01       29 阅读
  8. 代码随想算法训练25|回溯

    2024-07-12 03:56:01       34 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-12 03:56:01       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-12 03:56:01       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-12 03:56:01       58 阅读
  4. Python语言-面向对象

    2024-07-12 03:56:01       69 阅读

热门阅读

  1. 担心插座预留的不够用,家里装修留多少开关插座

    2024-07-12 03:56:01       20 阅读
  2. Vue路由传参和接参如何实现

    2024-07-12 03:56:01       26 阅读
  3. android轮播图入门2——触摸停止与指示器

    2024-07-12 03:56:01       24 阅读
  4. Symfony 是一个用于构建PHP的框架

    2024-07-12 03:56:01       26 阅读
  5. 利用反射API时的代码注入风险与防护指南

    2024-07-12 03:56:01       19 阅读
  6. python为什么慢?(自用)

    2024-07-12 03:56:01       21 阅读
  7. F1-score

    2024-07-12 03:56:01       18 阅读