917. 仅仅反转字母

难度:简单

题目:

给你一个字符串 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);
    }
}

注意程序注释中的第三点,是容易出错忽视的关键点。

你可能感兴趣的:(917. 仅仅反转字母)