您的位置:首页 > 其它

LeetCode - 345. Reverse Vowels of a String

2016-07-06 08:07 253 查看
和前面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中并没有针对条件变化的情况,所以在写完循环体的大致内容之后,要检查下循环变量会不会发生改变,这一点经常出错
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息