读题
题目难度:easy
题目要求:
- 字符串中的单词以单个空格隔开,并且字符串中不会有任何额外的空格;
- 同时要保留空格和初始单词顺序。
思路
翻转了整个字符串
一开始没好好读题,也没有好好看示例,上来就直接写了,写完很开心,想怎么这么简单。结果Run Code时候发现不对,这个代码是把整个字符串都反转过来了。
input = “Let’s take LeetCode contest”;
output = “tsetnoc edoCteeL ekat s’teL”;
代码如下:
class Solution {
public String reverseWords(String s) {
String ss = s;
char[] ch = new char[ss.length()];
ch = ss.toCharArray();
char ch2;
for(int i = 0; i < ss.length() / 2; i++) {
ch2 = ch[i];
ch[i] = ch[ss.length() - 1 - i];
ch[ss.length() - 1 - i] = ch2;
}
String s1;
s1 = ss.valueOf(ch);
return s1;
}
}
翻转字符串中的单词并保持单词顺序
要保持顺序,即需要根据空格识别出待反转的部分。代码中用a和b记录待反转部分的首尾,然后传到函数swapString()中翻转。为了方便,我重新声明了一个字符型数组,把要翻转的部分复制进去。运行的时候发现,假如要复制ch[]的a = 4到b = 7的部分,即长度为4时,应该是:
ch1 = Arrays.copyOfRange(ch, a, b+1);
或者用下面这句替代也是一样的:
System.arraycopy(ch, a, ch1, 0, b - a + 1);
代码如下:
import java.util.Arrays;
class Solution {
public String reverseWords(String s) {
String ss = s;
char[] ch = new char[ss.length()];
ch = ss.toCharArray();
int a = 0,b = 0;
for(int i = 0; i < ch.length; i++) {
if(ch[i] == ' ') {
b = i - 1;
swapString(ch,a,b);
a = i + 1;
}
if(i == ch.length-1) {
b = i;
swapString(ch,a,b);
}
}
String s1;
s1 = ss.valueOf(ch);
return s1;
}
public void swapString(char[] ch, int a, int b){
//ch,待翻转的数组,a,起始位置,b,终止位置
char[] ch1 = new char[b - a + 1];
ch1 = Arrays.copyOfRange(ch, a, b+1);
//System.arraycopy(ch, a, ch1, 0, b - a + 1); //这句也是一样的
char temp;
for(int i = 0; i < (ch1.length + 1)/2; i++) {
temp = ch1[i];
ch1[i] = ch1[ch1.length - 1 - i];
ch1[ch1.length - 1 - i] = temp;
}
System.arraycopy(ch1, 0, ch, a, ch1.length);
}
}
最后提交成功:
感想
感想就是要好好看题啦,不然做半天会发现离题还有十万八千里呢。