Nowcoder java-翻转单词顺序列
(题目来自牛客网)
思路
先翻转所有的字符,再翻转逐个单词。
利用滑动窗口的思想,遇到空格就翻转,然后两者一起跳转到空格后重新滑动翻转。
需要特殊考虑,如果right到了最后一个单词的末尾,那么直接翻转最后一个单词。因为最后一个单词结束不需要空格。
问题
为什么将下面代码块中的 if 改为else if 就会报错(数组越界的错误) ?
求解各位!
if (right == ch.length - 1) {//如果right到了最后一个单词的末尾,那么直接翻转最后一个单词。因为最后一个单词结束不需要空格。
reverseChars(ch, left, right);
break;
}
代码
import java.util.Arrays;
public class Solution {
public String ReverseSentence(String str) {
if (str == null || str.length() <= 1) {
return str;
}
char[] ch = str.toCharArray();
reverseChars(ch, 0, str.length() - 1);//先翻转整体
int left = 0;
int right = 0;
while (left < str.length()) {//再翻转局部
if (ch[right] == ' ') {//如果遇到空格,那么翻转空格之前的单词
reverseChars(ch, left, right - 1);
right++;
left = right;
}
if (right == ch.length - 1) {//如果right到了最后一个单词的末尾,那么直接翻转最后一个单词。因为最后一个单词结束不需要空格。
reverseChars(ch, left, right);
break;
}
right++;//没有遇到空格之前,证明一个单词还没有遍历完全,所以继续向后。
}
return String.valueOf(ch);//方法返回类型是String,所以最后返回的事ch数组的值,即数组里的字符串,不能直接返回数组ch。
}
public static void reverseChars(char[] ch, int left, int right) {
while (left < right) {
char temp = ch[left];
ch[left] = ch[right];
ch[right] = temp;
left++;
right--;
}
}
}