代码随想录 Day09


151、翻转字符串里的单词

V01:
public String reverseWords(String s) {
    String[] strings = Arrays.stream(s.split(" "))
            .filter(str -> !str.isBlank()).toArray(String[]::new);
    int left = 0, right = strings.length - 1;
    while (left < right) {
        String temp = strings[left];
        strings[left] = strings[right];
        strings[right] = temp;
        left++;
        right--;
    }
    return String.join(" ", strings);
}

V02:
public String reverseWords(String s) {
    String[] strings = s.trim().split(" ");
    StringBuilder res = new StringBuilder();
    for (int i = strings.length - 1; i >= 0; i--) {
        if (strings[i].isEmpty()) {
            continue;
        }
        res.append(strings[i]).append(" ");
    }
    return res.toString().trim();
}

V03:
public String reverseWords(String s) {
    char[] chars = s.toCharArray();
    char[] result = new char[chars.length + 1];

    int newPosition = 0, i = chars.length - 1;

    while (i >= 0) {
        while (i >= 0 && chars[i] == ' ') i--;
        int right = i;
        while (i >= 0 && chars[i] != ' ') i--;
        for (int left = i + 1; left <= right; left++) {
            result[newPosition] = chars[left];
            newPosition++;
            if (left == right) {
                result[newPosition] = ' ';
                newPosition++;
            }
        }
    }

    if (newPosition == 0) {
        return "";
    } else {
        return new String(result, 0, newPosition - 1);
    }
}

附加 55、右旋转字符串

题目链接:链接

import java.util.Scanner;

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();

        int len = s.length();  //获取字符串长度
        char[] chars = s.toCharArray();
        reverseString(chars, 0, len - 1);  //反转整个字符串
        reverseString(chars, 0, n - 1);  //反转前一段字符串,此时的字符串首尾尾是0,n - 1
        reverseString(chars, n, len - 1);  //反转后一段字符串,此时的字符串首尾尾是n,len - 1
        
        System.out.println(chars);

    }

    public static void reverseString(char[] array, int start, int end) {
        while (start < end) {
            char temp = array[left];
            array[left] = array[right];
            array[right] = temp;
            left++;
            right--;
        }
    }
}

好好好~原来是反转反转再反转


28、实现 strStr()

public int strStr(String haystack, String needle) {
    char[] haystackChars = haystack.toCharArray();
    char[] needleChars = needle.toCharArray();
    if (needleChars.length > haystackChars.length) {
        return -1;
    }
    for (int i = 0; i < haystackChars.length; i++) {
        if (haystackChars[i] != needleChars[0]) {
            continue;
        }
        int temp = i;
        for (char needleChar : needleChars) {
            if (temp >= haystackChars.length 
                    || haystackChars[temp] != needleChar) {
                break;
            }
            temp++;
        }
        if ((temp - i) == needleChars.length) {
            return i;
        }
    }
    return -1;
}

可以使用 KMP ,不过第二遍再说吧
KMP 理论篇
KMP 代码篇


459、重复的子字符串

public boolean repeatedSubstringPattern(String s) {
    String str = s + s;
    return str.substring(1, str.length() - 1).contains(s);
}

网友的神解法,自己着实是没有想到

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值