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);
}
网友的神解法,自己着实是没有想到