题目
www.nowcoder.com/practice/[4…](www.nowcoder.com/practice/48…)
我的题解
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args)throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
String str;
while ((str = bf.readLine()) != null) {
String[] arr = str.split("\\s+");
StringBuilder sb = new StringBuilder();
for (int i = arr.length - 1; i >= 0; i--) {
sb.append(arr[i]).append(" ");
}
System.out.println(sb.substring(0, sb.length() - 1));
}
}
}
思路:
1、String[] arr = str.split("\\s+");
拆分为数组倒叙输出
2、System.out.println(sb.substring(0, sb.length() - 1));
去除最后一个空格
参考题解
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args)throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
String str;
while ((str = bf.readLine()) != null) {
String[] arr = str.split("\\s+");
StringBuilder sb = new StringBuilder();
for (int i = arr.length - 1; i >= 0; i--) {
sb.append(" ").append(arr[i]);
}
sb.deleteCharAt(0);
System.out.println(sb.toString());
}
}
}
总结:
1、三种方式拼接字符串并去掉最后的连接符小尾巴
StringBuilder sb = new StringBuilder();
for (int i = arr.length - 1; i >= 0; i--) {
sb.append(arr[i]).append(" ");
}
System.out.println(sb.substring(0, sb.length() - 1));
StringBuilder sb = new StringBuilder();
for (int i = arr.length - 1; i >= 0; i--) {
sb.append(" ").append(arr[i]);
}
sb.deleteCharAt(0);
System.out.println(sb.toString());
StringBuilder sb = new StringBuilder();
for (int i = arr.length - 1; i >= 0; i--) {
sb.append(arr[i]).append(" ");
}
sb.deleteCharAt(sb.length()-1);
System.out.println(sb);
高效题解
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str;
while ((str = br.readLine()) != null) {
StringBuilder sb = new StringBuilder();
char[] chars = (str + " ").toCharArray();
int len = str.length();
// 碰到空格就将当前
int first = 0;
int last = len;
char[] newchar = new char[len];
for (int j = 0; j <= str.length(); j++) {
char c = chars[j];
if (c == ' ') {
// 需要copy的长度
int _len = j - first;
// 开始位置
int despos = last - _len;
System.arraycopy(chars, first, newchar, despos, _len);
// 从旧的下一个位置开始copy,需要赋值空,所以多移动一位
first = j + 1;
len = len - _len - 1;
last = len;
// copy完成后,指针变动后,赋值空
if (last > 0) {
newchar[last] = ' ';
}
}
}
System.out.println(new String(newchar));
}
}
}
总结:
1、和上面的相比就快几ms、太复杂工作用的很少、不研究