问题描述:
给定一个字符串 S,返回 “反转后的” 字符串,其中不是字母的字符都保留在原地,而所有字母的位置发生反转
示例:
示例 1:
输入:"ab-cd"
输出:"dc-ba"
示例 2:
输入:"a-bC-dEf-ghIj"
输出:"j-Ih-gfE-dCba"
示例 3:
输入:"Test1ng-Leet=code-Q!"
输出:"Qedo1ct-eeLg=ntse-T!"
分析:
抓住题目要求的,只有字母能动,那么就用两个变量分别作为首下标及尾下标进行一个while循环,当首下标大于尾下标时,循环结束。循环体中,需要判断首下标和尾下标所指向的是不是字母。
如果只有首下标所指向的是字母,那么尾下标向前移动一位;
如果只有尾下标所指向的是字母,那么首下标向后移动一位;
如果首、尾下标所指向的都是字母,首先进行交换,然后首下标向后移动一位,尾下标向前移动一位。
代码:
class Solution {
public String reverseOnlyLetters(String S) {
char[] a = S.toCharArray();
int i =0;
int j=a.length-1;
while(i<j){
if(a[i]>='A'&&a[i]<='Z'||a[i]>='a'&&a[i]<='z'){
if(a[j]>='A'&&a[j]<='Z'||a[j]>='a'&&a[j]<='z'){
swap(a,i,j);
i++;
j--;
}else{
j--;
}
}else{
i++;
}
}
return new String(a);
}
public void swap(char[] a,int i,int j){
char tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
}