代码随想录算法训练营,9月5日 | 151.翻转字符串里的单词,卡码网:55.右旋转字符串,28. 实现 strStr(),459.重复的子字符串

151.翻转字符串里的单词
题目链接:151.翻转字符串里的单词
文档讲解︰代码随想录(programmercarl.com)
视频讲解︰翻转字符串里的单词
日期:2024-09-05

想法:要求:1.不使用Java内置方法实现;思路:1.去除首尾以及中间多余空格。2.反转整个字符串;3.反转各个单词(快慢指针O(n))
Java代码如下:

class Solution {
    public char[] removeExtraSpaces(char[] chars) {
        int slow = 0;
        for(int fast = 0; fast < chars.length; fast++){
            if(chars[fast] != ' '){//删所有空格
                if(slow != 0) chars[slow++] = ' ';//补回空格
                while(fast < chars.length && chars[fast] != ' '){
                    chars[slow++] = chars[fast++];
                }
            }
        }
        char[] newChars = new char[slow];
        System.arraycopy(chars, 0, newChars, 0, slow); 
        return newChars;
    }

    public void reverse(char[] chars, int left, int right) {
        while(left < right){
            char temp = chars[left];
            chars[left] = chars[right];
            chars[right] = temp;
            left++;
            right--;
        }
    }

    public String reverseWords(String s) {
        char[] chars = s.toCharArray();
        chars = removeExtraSpaces(chars);
        reverse(chars, 0, chars.length - 1);
        int start = 0;
        for(int end = 0; end <= chars.length; end++){
            if(end == chars.length || chars[end] == ' '){
                reverse(chars, start, end - 1);
                start = end + 1;
            }
        }
        return new String(chars);
    }
}

总结:end == chars.length || chars[end] == ' '注意顺序。

卡码网:55.右旋转字符串
题目链接:卡码网:55.右旋转字符串
文档讲解︰代码随想录(programmercarl.com)
日期:2024-09-05

想法:学习上一题思路,将字符串整体翻转,检查后发现,只需要再反转前n个字符,和剩下的字符结果就对了。
Java代码如下:

import java.util.*;

public class Main{
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        int n = Integer.parseInt(in.nextLine());
        String s = in.nextLine();
        char[] chars = s.toCharArray();
        int len = s.length();
        reverse(chars, 0, len - 1);
        reverse(chars, 0, n - 1);
        reverse(chars, n, len - 1);
        System.out.println(chars);
    }
    
    public static void reverse(char[] chars, int left, int right){
        while(left < right){
            char temp = chars[left];
            chars[left] = chars[right];
            chars[right] = temp;
            left++;
            right--;
        }
    } 
}

KMP周末补。
字符串总结:
1.Java的字符串不能不增加空间直接操作,一般将其转换为char[]即可与C++匹配上
2.用双指针法实现了反转字符串,替换、删除空格操作
3.反转字符串的思路基本是先整体再局部
4.KMP:

双指针:
1.数组:移除元素。
2.链表:翻转链表,在链表中求环
3.字符串:反转字符串,替换空格(从后向前填充),删除冗余空格
4.N数之和:3,4,...,n数和(通过前后两个指针不算向中间逼近,在一个for循环下完成两个for循环的工作)

posted @   漪欢酒  阅读(3)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示