難度:簡(jiǎn)單
題目:
給你一個(gè)字符串 s ,根據(jù)下述規(guī)則反轉(zhuǎn)字符串:
- 所有非英文字母保留在原有位置。
- 所有英文字母(小寫(xiě)或大寫(xiě))位置反轉(zhuǎn)。
返回反轉(zhuǎn)后的s* 。*
示例 1:
輸入:s = "ab-cd"
輸出:"dc-ba"
示例 2:
輸入:s = "a-bC-dEf-ghIj"
輸出:"j-Ih-gfE-dCba"
示例 3:
輸入:s = "Test1ng-Leet=code-Q!"
輸出:"Qedo1ct-eeLg=ntse-T!"
解題思路:雙指針
1)將String轉(zhuǎn)換為數(shù)組;
2)設(shè)定兩個(gè)指針,一左一右遍歷數(shù)組,在兩者都為英文字母時(shí),位置反轉(zhuǎn)。
Java代碼
class Solution {
public String reverseOnlyLetters(String s) {
int left = 0, right = s.length() - 1;
char[] array = new char[s.length()];
array = s.toCharArray(); # 1)將String轉(zhuǎn)換為array
while(true){
while(left < right && !Character.isLetter(array[left])){ # 2)判斷左邊指針指向的是否為英文字母
left++;
}
while(left < right && !Character.isLetter(array[right])){ # 2)判斷右邊指針指向的是否為英文字母
right--;
}
if (left >= right) { # 3)##注意:左右兩邊指針遍歷后,要保證左邊指針始終在右邊指針的左邊。這樣就不會(huì)使得兩邊指針重復(fù)遍歷,發(fā)生錯(cuò)誤。##
break;
}
char temp = array[left];
array[left] = array[right];
array[right] = temp;
left++;
right--;
}
return new String(array);
}
}
注意程序注釋中的第三點(diǎn),是容易出錯(cuò)忽視的關(guān)鍵點(diǎn)。