/**
* 将字符串中的单词反转。如i am Chinese=》Chinese am i
*
* @author crystal555
*/
public class WordReverse {
public static void main(String[] args) {
String s = "i am Chinese man";
String ss = method1(s);
System.out.println(ss);
ss = method2(s);
System.out.println(ss);
}
/**
* 最简单的方法,直接split,然后交换
*
* @param i
*/
private static String method1(String s) {
// TODO Auto-generated method stub
String[] a = s.split(" ");
for (int i = 0; i < a.length / 2; i++) {
String temp = a[i];
a[i] = a[a.length - 1 - i];
a[a.length - 1 - i] = temp;
}
String result = "";
for (String ss : a) {
result += ss + " ";
}
return result;
}
/**
* 考虑空间,先将整个句子反转,然后把单词部分反转,反转的时候不实用中间变量,直接用异或或者加减交换
*
* @param s
* @return
*/
private static String method2(String s) {
char[] a = s.toCharArray();
// 先反转整个句子
for (int i = 0; i < a.length / 2; i++) {
// 最原始方法,但是需要空间
// char tmp = a[i];
// a[i] = a[a.length-1-i];
// a[a.length-1-i] = tmp;
// 不用空间,用加减方法交换
// a[a.length-1-i] += a[i];
// a[i] = (char)(a[a.length-1-i] - a[i]);
// a[a.length-1-i] -= a[i];
// 不用空间,用异或方法交换
a[i] ^= a[a.length - 1 - i];
a[a.length - 1 - i] ^= a[i];
a[i] ^= a[a.length - 1 - i];
}
// 再反转所有单词
for (int j = 0; j<a.length; j++) {
int start = j;
int end=j;
for(end=j;end<a.length&&a[end]!=' ';end++);
// System.out.println(start+" "+end);
for(int k=start;k<(end+start)/2;k++){
a[k] ^= a[end+start - 1 - k];
a[end+start - 1 - k] ^= a[k];
a[k] ^= a[end+start - 1 - k];
}
j = end;
}
return new String(a);
}
}
原地反转字符串中的单词
最新推荐文章于 2020-08-14 15:56:41 发布