解题思路:现将整个字符串将"I am Student!"逆置,得到字符串"!tnedutS ma I",在逆置每一个单词,得到字符串"Student! am I";所以要写一个方法逆置数组,一个方法来判断单词,调用逆置数组的方法实现单词的逆置。
/**
* 逆置数组
* @param array
* @param a
* @param b
*/
public static void swap(char[] array,int a,int b) {
char tmp;
for(;a < b;a++,b--) {
tmp = array[a];
array[a] = array[b];
array[b] = tmp;
}
}
/**
* 循环向右移数组k位
* @param string
* @param k
*/
public static String shift_k(String string,int k) {
char[] chars = string.toCharArray();
int n = chars.length;
k = k % n;
swap(chars,0,n-k-1);
swap(chars,n-k,n-1);
swap(chars,0,n-1);
return String.valueOf(chars);
}
/**
* 先逆置整个数组,然后找到每个单词,逆置每个单词
* @param str
* @return
*/
public static String inversion(String str) {
char[] chars = str.toCharArray();
swap(chars,0,chars.length-1);//逆置整个数组
int start = 0;
//对每个单词反转
for(int i = 1;i < chars.length;i++) {
if(chars[i] == ' ') {
swap(chars,start,i-1);
start = i+1;
}
}
swap(chars,start,chars.length-1);
return String.valueOf(chars);
}
public static void main(String[] args) {
String str1 = "abcdef";
System.out.println(shift_k(str1,2));
String str2 = "hello tulun and world!";
System.out.println(inversion(str2));
}
运行结果:
efabcd
world! and tulun hello