反轉字符串
題目描述:將字符串"##We###Are###Family!###"
反轉為"###!ylimaF###erA###eW##"
。
分析與解答:這題我們的解答方法有很多,常見的方法是使用數組,下面來介紹用數據結構中的Stack(棧)來完成反轉。
Stack的特點是FILO(First In,Last Out)---先進后出。此特點用于將字符串反轉非常合適,以下是代碼實現:
import java.util.Stack;
public class Demo {
public static void main(String[] args) {
System.out.println(ReverseAllStringWithStack("##We###Are###Family!###"));
}
public static String ReverseAllStringWithStack(String string) {
//如果string等于null或等于""時,返回string。
if (string == null || string.length() == 0)
return string;
// 新建一個Stack,用于存放Character類型。為什么存放Character而不是char,
//因為泛型只能指定是類或接口類型,而不能是primitive主(基本)數據類型。
Stack<Character> stringStack = new Stack<>();
//toCharArray()將字符串轉換成char類型數組
char[] array = string.toCharArray();
//使用for-each將數組中的元素push(推)進Stack
for (Character c : array) {
stringStack.push(c);
}
int length = string.length();
//利用for循環將元素從棧頂開始,依次彈出
for (int i = 0; i < length; i++) {
array[i] = stringStack.pop();
}
//String的重載構造方法將char[]數組轉換,返回一個實例化String對象
return new String(array);
}
}
多次反轉字符串
題目描述:將字符串"##We###Are###Family!###"
反轉為"###Family!###Are###We##"
。
分析與解答:
此題和上題的區別是,單詞不反轉。解決思路有兩個:
- 將所有字符串反轉后,再將反轉結果中的單詞再一次反轉。
- 先將字符串中的單詞反轉,再將整體反轉。
兩種方式的區別不大,下面代碼是第一種方式的實現。
import java.util.Stack;
public class Demo {
public static void main(String[] args) {
System.out.println(ReverseAllStringWithStack("##We###Are###Family!###"));
}
public static String ReverseAllStringWithStack(String stringAll) {
if (stringAll == null || stringAll.length() == 0)
return stringAll;
Stack<Character> stringAllStack = new Stack<>();
char[] array = stringAll.toCharArray();
for (Character c : array) {
stringAllStack.push(c);
}
int length = stringAll.length();
for (int i = 0; i < length; i++) {
array[i] = stringAllStack.pop();
}
int from = 0, to = 0;//from是單詞在數組中的起始下標,to是結束下標
String string = null;//存放排序后的字符串
for (int i = 0; i < length; ) {
while (array[i] == '#') {//如果字符是'#',繼續循環
from = ++i;//單詞起始下標是循環結束時的下標 + 1,所以from = i + 1;i++;->from = ++i
if (i >= length)//防止下標溢出
break;
}
if (i >= length)//防止下標溢出
break;
while (array[i] != '#') {//當字符是'#',循環結束
to = i++;//單詞結束下標就是循環結束時的下標,所以to = i;i++;->to = i++
}
string = ReverseStringWithStack(array, from, to);//交換找到的單詞順序
}
return string;
}
public static String ReverseStringWithStack(char[] array, int from, int to) {
if (array.length == 0)
return null;
for (int i = 0; i < from; i++) {
while (from < to) {
char t = array[from];
array[from++] = array[to];//array[from++]->array[from] = array[to];from++;
array[to--] = t;
}
}
return new String(array);
}
}
總結
不管是#
還是空格等符號,反轉方法均一樣。順序不變的部分經過兩次反轉就跟原來一樣。
我們使用好IDEA的dubug功能能解決很多代碼錯誤。建議多動手實踐。