题目描述
给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。
示例:
输入:"Let's take LeetCode contest"
输出:"s'teL ekat edoCteeL tsetnoc"
解题历程
第一次
class Solution {
public String reverseWords(String s) {
int i=0;
String result="";
String[] ch = s.split(" ");
while(i<ch.length){
result += change(ch[i].toCharArray())+" "; //将ch[i]转化为char[]类型传入函数
i++;
}
result = result.substring(0, result.length() - 1);//删除最后一个空白字符
return result;
}
//部分字符翻转 遍历
public String change(char[] str){
int left =0 ,right = str.length-1;
while ( left <= right ){
char temp = str[ left ];
str [ left ]= str [ right ];
str [ right ]= temp ;
left ++;
right --;
}
return String.valueOf(str); //将char[]转化为String类型返回
}
}
思路二
直接在原字符串上进行操作,避免额外的空间开销。
当找到一个单词的时候,我们交换字符串第一个字符与倒数第一个字符,
随后交换第二个字符与倒数第二个字符……
如此反复,就可以在原空间上翻转单词。
需要注意的是,原地解法在某些语言(比如 Java
,JavaScript)中不适用,因为在这些语言中 String 类型是一个不可变的类型。
方法三(极佳)
class Solution {
public String reverseWords(String s) {
char[] chars = s.toCharArray();
int l = chars.length;
int startIndex= 0;
int endIndex = 0;
while (endIndex < l && startIndex < l){
int endValue = chars[endIndex];
if (endValue == ' ') {
reverseString(chars,startIndex,endIndex - 1);
startIndex = endIndex + 1;
endIndex++;
}
endIndex++;
}
reverseString(chars,startIndex,endIndex - 1);
return new String(chars);
}
public void reverseString(char[] s,int start,int end) {
char temp;
int l = end - start;
int flg = (l - l % 2) / 2;
for (int i = 0; i <= flg; i++) {
temp = s[start + i];
s[start + i] = s[start + l - i];
s[start + l - i] = temp;
}
}
}
总结
1.str.toCharArray()
将String类型的str转化为char[]类型
2.String.valueOf(str)
将char[]类型的str转化为String类型
3.str= str.substring(0, str.length() - 1)
去除String类型str的最后一个字符