剑指Offer43--面试题58 - I. 翻转单词顺序
题目描述
牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?
得到空值索引 再用substring切片
import java.util.ArrayList;
public class Solution {
public String ReverseSentence(String str) {
ArrayList<Integer> arr = new ArrayList<Integer>();
ArrayList<String> res = new ArrayList<String>();
char[] strChar = str.toCharArray();
for(int i=0; i<str.length(); i++){
if(strChar[i]==' '){
System.out.println(i);
// 得到空值索引
arr.add(i);
}
}
if(arr.size() == 0) return str;
res.add(str.substring(0,arr.get(0)));
for(int i=0;i< arr.size()-1;i++){
res.add(str.substring(arr.get(i)+1,arr.get(i+1)));
}
res.add(str.substring(arr.get(arr.size()-1)+1,str.length()));
String r = "";
for(int i=res.size()-1;i>= 1;i--){
r += res.get(i)+" ";
}
r += res.get(0);
return r;
}
}
使用String自带的Split切片 leetcode
class Solution {
public String reverseWords(String str) {
if(str.length()==0) return "";
// 按照一个或者多个空格分隔
String[] strSplit = str.split("\\s+");
if(strSplit.length == 0) return "";
StringBuilder res =new StringBuilder();
for(int i=strSplit.length-1; i>=0;i--){
if(strSplit[i].length()!=0){
res.append(strSplit[i]+" ");
}
}
// res.toString().substring(0,res.toString().length()-3);
return res.toString().substring(0,res.toString().length()-1);
}
}
别人的,搜索每个单词的边界
class Solution {
public String reverseWords(String s) {
s = s.trim(); // 删除首尾空格
int j = s.length() - 1, i = j;
StringBuilder res = new StringBuilder();
while(i >= 0) {
while(i >= 0 && s.charAt(i) != ' ') i--; // 搜索首个空格
res.append(s.substring(i + 1, j + 1) + " "); // 添加单词
while(i >= 0 && s.charAt(i) == ' ') i--; // 跳过单词间空格
j = i; // j 指向下个单词的尾字符
}
return res.toString().trim(); // 转化为字符串并返回
}
}
别人的,先交换 在拼接 双百``
class Solution {
public String reverseWords(String s) {
String[] words = s.split(" ");
int i = 0,j = words.length - 1;
while (i < j) {
if (words[i].isEmpty()) {
i++;
continue;
}
if (words[j].isEmpty()) {
j--;
continue;
}
String tmp = words[j]; //交换非空字符串
words[j--] = words[i];
words[i++] = tmp;
}
StringBuilder res = new StringBuilder();
for (int k = 0; k < words.length; k++) {//重新拼接一下
String word = words[k];
if (word.isEmpty()) {
continue;
}
res.append(word);
if (k < words.length - 1) {
res.append(" ");
}
}
return res.toString();
}
}