给你一个字符串 s
,根据下述规则反转字符串:
- 所有非英文字母保留在原有位置。
- 所有英文字母(小写或大写)位置反转。
返回反转后的 s
。
思路:
双指针
根据题意进行模拟即可,每次都使用 i 和 j 分别指向左端和右端可以被交换的字母,若当前指针指向的不是字母,则分别往中间移动,直到找到下一个可交换的字母位置,每次交换结束,两指针均往中间移动一位。
class Solution {
public String reverseOnlyLetters(String s) {
char[] cs = s.toCharArray();
int n = cs.length;
for (int i = 0, j = n - 1; i < j; ) {
while (i < j && !Character.isLetter(cs[i])) i++;
while (i < j && !Character.isLetter(cs[j])) j--;
if (i < j) {
char c = cs[i];
cs[i++] = cs[j];
cs[j--] = c;
}
}
return String.valueOf(cs);
}
}
力扣解
class Solution {
public String reverseOnlyLetters(String s) {
int n = s.length();
char[] arr = s.toCharArray();
int left = 0, right = n - 1;
while (true) {
while (left < right && !Character.isLetter(s.charAt(left))) { // 判断左边是否扫描到字母
left++;
}
while (right > left && !Character.isLetter(s.charAt(right))) { // 判断右边是否扫描到字母
right--;
}
if (left >= right) {
break;
}
swap(arr, left, right);
left++;
right--;
}
return new String(arr);
}
public void swap(char[] arr, int left, int right) {
char temp = arr[left];
arr[left] = arr[right];
arr[right] = temp;
}
}
charAt(int index)方法是一个能够用来检索特定索引下的字符的String实例的方法。
charAt()方法返回指定索引位置的char值。索引范围为0~length()-1,如: str.charAt(0)检索str中的第一个字符,str.charAt(str.length()-1)检索最后一个字符。
isLetter方法用于判断参数字符是否为字母。
语法1 public static boolean isLetter(char ch)
返回值:如果字符为字母,则返回true;否则返回false。
参数:ch为要测试的字符。
示例 本示例通过Character类的isLetter方法,判断字符“*”是否为字母,并将结果赋值给boolean型变量bool。由于“*”不属于字母范围内,因此bool为false。
boolean bool= Character.isLetter('*');
System.out.println(bool);
语法2 public static boolean isLetter(int codePoint)
返回值:如果字符为字母,则返回true;否则返回false。
参数:codePoint为要测试的字符(Unicode 代码点)。
将J先赋值给i ,然后i自增;
讲C赋值给j,然后J自减;