反轉(zhuǎn)字符串
題目描述:將字符串"##We###Are###Family!###"
反轉(zhuǎn)為"###!ylimaF###erA###eW##"
诡曙。
分析與解答:這題我們的解答方法有很多,常見的方法是使用數(shù)組票髓,下面來介紹用數(shù)據(jù)結(jié)構(gòu)中的Stack(棧)來完成反轉(zhuǎn)锅纺。
Stack的特點(diǎn)是FILO(First In掷空,Last Out)---先進(jìn)后出。此特點(diǎn)用于將字符串反轉(zhuǎn)非常合適囤锉,以下是代碼實(shí)現(xiàn):
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或等于""時(shí)坦弟,返回string。
if (string == null || string.length() == 0)
return string;
// 新建一個(gè)Stack官地,用于存放Character類型酿傍。為什么存放Character而不是char,
//因?yàn)榉盒椭荒苤付ㄊ穷惢蚪涌陬愋颓耄荒苁莗rimitive主(基本)數(shù)據(jù)類型赤炒。
Stack<Character> stringStack = new Stack<>();
//toCharArray()將字符串轉(zhuǎn)換成char類型數(shù)組
char[] array = string.toCharArray();
//使用for-each將數(shù)組中的元素push(推)進(jìn)Stack
for (Character c : array) {
stringStack.push(c);
}
int length = string.length();
//利用for循環(huán)將元素從棧頂開始,依次彈出
for (int i = 0; i < length; i++) {
array[i] = stringStack.pop();
}
//String的重載構(gòu)造方法將char[]數(shù)組轉(zhuǎn)換亏较,返回一個(gè)實(shí)例化String對(duì)象
return new String(array);
}
}
多次反轉(zhuǎn)字符串
題目描述:將字符串"##We###Are###Family!###"
反轉(zhuǎn)為"###Family!###Are###We##"
莺褒。
分析與解答:
此題和上題的區(qū)別是,單詞不反轉(zhuǎn)雪情。解決思路有兩個(gè):
- 將所有字符串反轉(zhuǎn)后遵岩,再將反轉(zhuǎn)結(jié)果中的單詞再一次反轉(zhuǎn)。
- 先將字符串中的單詞反轉(zhuǎn)巡通,再將整體反轉(zhuǎn)尘执。
兩種方式的區(qū)別不大,下面代碼是第一種方式的實(shí)現(xiàn)宴凉。
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是單詞在數(shù)組中的起始下標(biāo)誊锭,to是結(jié)束下標(biāo)
String string = null;//存放排序后的字符串
for (int i = 0; i < length; ) {
while (array[i] == '#') {//如果字符是'#',繼續(xù)循環(huán)
from = ++i;//單詞起始下標(biāo)是循環(huán)結(jié)束時(shí)的下標(biāo) + 1弥锄,所以from = i + 1;i++;->from = ++i
if (i >= length)//防止下標(biāo)溢出
break;
}
if (i >= length)//防止下標(biāo)溢出
break;
while (array[i] != '#') {//當(dāng)字符是'#'炉旷,循環(huán)結(jié)束
to = i++;//單詞結(jié)束下標(biāo)就是循環(huán)結(jié)束時(shí)的下標(biāo)签孔,所以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);
}
}
總結(jié)
不管是#
還是空格等符號(hào),反轉(zhuǎn)方法均一樣窘行。順序不變的部分經(jīng)過兩次反轉(zhuǎn)就跟原來一樣。
我們使用好IDEA的dubug功能能解決很多代碼錯(cuò)誤图仓。建議多動(dòng)手實(shí)踐罐盔。