这是LeetCode上的一道编程题,题目是给出个英文单词(字符串,含有大小写),将其中的元音字母调换位置。题目链接:Reverse Vowels of a String
下面来看实现的代码:
public static String reverseVowels(String s) {
char[] cArr = s.toCharArray();
StringBuilder sb = new StringBuilder();
int len = cArr.length;
char temp = ' ';
ArrayList<Character> vowelList = new ArrayList<Character>();
vowelList.add('a');
vowelList.add('e');
vowelList.add('i');
vowelList.add('o');
vowelList.add('A');
vowelList.add('E');
vowelList.add('I');
vowelList.add('O');
vowelList.add('U');
boolean flag = false;
int begin = 0;
int end = len-1;
while(begin<=end){
flag = false;
if(vowelList.contains(cArr[begin])){
flag = true;
temp = cArr[begin];
}else{
begin++;
}
if(vowelList.contains(cArr[end]) && flag == true){
cArr[begin] = cArr[end];
cArr[end] = temp;
begin++;
end--;
}else if(vowelList.contains(cArr[end])){
continue;
}else{
end--;
}
}
for (Character character : cArr) {
sb.append(character);
}
return sb.toString();
}
在这段代码当中,有以下几点值得考虑:
- 因为题目当中只是说明了元音字母,我们很容易忽略了大,小写这两种情况;
- 实际上,这道题目的思考方式类似于之前的数组奇偶数分离,只是这道题需要考虑的更加具体;
使用StringBuilder进行字符的拼接,并作为最终的返回值将其返回。
这其中,begin从字符数组的头开始遍历,end从字符数组的尾开始遍历。begin找到一个元音字符就在该index等待,没找到就进行index+1操作;end找到一个元音字符,并且此时的begin也找到了元音字符(flag为true的时候),进行位置交换,否则只是end找到了元音字符则跳过这次循环,如果end也没找到元音字符,那么则end进行+1操作。
我觉得这是比较笨的实现方式,应该有更加巧妙的方式来实现这道题。这个方法的时间复杂度为O(n),空间复杂度为S(1)。