LeetCode - 345. Reverse Vowels of a String

来源:互联网 发布:mysql minpoolsize 编辑:程序博客网 时间:2024/03/28 22:24

和前面Reverse String的思想是一样的,同样是需要维护两个指针,一个在开头,一个在结尾,如果遇到元音字母就互相交换它们。注意这里判断原因字母的方法,使用了一个String vowel:  "aeiouAEIOU",如果vowel.indexOf(c) == -1,那么说明当前的这个字符不是元音字母。代码如下:

public class Solution {    public String reverseVowels(String s) {        if(s == null || s.length()==0) return s;                String vowels = "aeiouAEIOU";        char[] chars = s.toCharArray();        int start = 0;        int end = s.length()-1;        while(start<end){                    while(start<end && vowels.indexOf(chars[start]) == -1){                start++;            }                    while(start<end && vowels.indexOf(chars[end]) == -1){                end--;            }                    char temp = chars[start];            chars[start] = chars[end];            chars[end] = temp;                    start++;            end--;        }        return new String(chars);    }}


注意这里还有一个非常容易出错的地方,就是在while(i < j)的内层循环中只使用while(vowel.indexOf(word.charAt(i)) == -1),这样是不对的,因为这可能会在内层循环中造成i, j的相互越界,也就是可能会出现多交换一次的情况,比如说针对"hello"这个元素,正常的交换应该是交换e和o,但是在这之后,由于内层循环并没有关于i和j的界限,所以接下来i会移动到o的位置,j会移动到i的位置,这样就又造成了一次交换,进而得到了错误的答案。

知识点:

1. 判断一个字符是元音字母的方法,进而引申为判断一个字符在不在可枚举数量的字符范围内的方法

2. 注意在写while循环的时候,因为在while中并没有针对条件变化的情况,所以在写完循环体的大致内容之后,要检查下循环变量会不会发生改变,这一点经常出错

0 0
原创粉丝点击