难度:简单
题目:
给你一个字符串 s
,根据下述规则反转字符串:
- 所有非英文字母保留在原有位置。
- 所有英文字母(小写或大写)位置反转。
返回反转后的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转换为数组;
2)设定两个指针,一左一右遍历数组,在两者都为英文字母时,位置反转。
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转换为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)##注意:左右两边指针遍历后,要保证左边指针始终在右边指针的左边。这样就不会使得两边指针重复遍历,发生错误。##
break;
}
char temp = array[left];
array[left] = array[right];
array[right] = temp;
left++;
right--;
}
return new String(array);
}
}
注意程序注释中的第三点,是容易出错忽视的关键点。