#算法#Java#字符串#leetcode
今天刚做完题,依然是两道字符串相关的题目。已经马上凌晨了,废话少说,直接上代码。
151.翻转字符串里的单词
题目链接:151. 反转字符串中的单词 - 力扣(LeetCode)
这道题我第一眼想法是:先去掉首位的空格,再将字符串按照空格split行成String数组,然后对数组做翻转,然后再append,中间加上空格。当然这样可以实现,但是对于算法题来说意义不大。
第二种思路:
1. 先去掉多余的空格,包括单词与单词之间的空格
2. 翻转整个字符串
3. 按照单词来翻转字符串
两种思路具体代码:
public String reverseWords(String s) {
if(null == s) {
return s;
}
//解法一,转为字符串数组,反转。(不推荐)
// s = s.trim();
// String[] ss = s.split(" +");
// int length = ss.length;
// int left = 0;
// int right = length - 1;
// while(left < right) {
// String temp = ss[left];
// ss[left] = ss[right];
// ss[right] = temp;
// left++;
// right--;
// }
// StringBuilder sb = new StringBuilder();
// sb.append(ss[0]);
// for(int i = 1; i < length; i++) {
// sb.append(" ").append(ss[i]);
// }
// return sb.toString();
//解法二 1.先去多余的空格;2.整体反转字符串;3. 反转单个单词
int start = 0;
int end = s.length() - 1;
while(s.charAt(start) == ' ') { start++;}
while(s.charAt(end) == ' ') { end--;}
StringBuilder sb = new StringBuilder();
while(start <= end) { //Note!!!
if(s.charAt(start) != ' ' || sb.charAt(sb.length() - 1) != ' ') {
//start 不是空格且sb最后一个不是空格,则添加
sb.append(s.charAt(start));
}
start++;
}
//整体反转字符串
int left = 0;
int right = sb.length() - 1;
while(left <right) {
char temp = sb.charAt(left);
sb.setCharAt(left, sb.charAt(right));
sb.setCharAt(right, temp);
left++;
right--;
}
//单个单词反转
int sbLength = sb.length();
int start1 = 0;
int end1 = start1 + 1;
while(start1 < sbLength) {
while(end1 < sbLength && sb.charAt(end1) != ' ') { //找单词
end1++;
}
reverseString(start1, end1 - 1, sb);
start1 = end1 + 1;
end1 = start1+1;
}
return sb.toString();
}
private void reverseString(int left, int right, StringBuilder sb) {
while(left < right) {
char temp = sb.charAt(left);
sb.setCharAt(left, sb.charAt(right));
sb.setCharAt(right, temp);
left++;
right--;
}
}
这里其实有挺多细节需要注意的,代码里面做了注释,我也是调试了很多次,leetcode直接敲没有自动提示就很难受,敲完还一堆编译问题。
55. 右旋字符串
题目链接:55. 右旋字符串(第八期模拟笔试)
这道题不是leetcode的,是代码随想录里面的题目,点链接同样可以打开看到。
这道题整体是对字符串翻转的运用,先整体翻转,然后翻转子字符串。这个思路是按照代码随想录里面的思路解决的,目前没仔细想其他思路。
具体代码:
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); //反转前一段字符串
reverseString(chars, n, len - 1); //反转后一段字符串
System.out.println(chars);
}
public static void reverseString(char[] ch, int start, int end) {
while (start < end) {
char temp = ch[start];
ch[start] = ch[end];
ch[end] = temp;
start++;
end--;
}
}
}
这个思路看代码就很清晰,有其他解决方法的朋友欢迎留言交流。
今天就到这里了,继续加油呀!