Reverse Vowels of a String双指针解法提交超时问题排查
超时问题根源分析
- 代码逻辑存在死循环漏洞,触发超时判定:
当左右指针同时指向元音字符时,完成交换操作后,后续的两个判断逻辑均为「当前指针指向的字符不是元音才移动指针」,此时两个指针指向的都是元音,因此都不会移动,循环条件a_pointer < b_pointer会一直成立,程序陷入无限循环。
修复方案
在完成元音交换的分支中新增指针移动逻辑即可,修改后可正常通过所有用例:
class Solution { public String reverseVowels(String s) { // O(1) 判断是否为元音 HashSet<Character> set = new HashSet<>(); set.add('a'); set.add('e'); set.add('i'); set.add('o'); set.add('u'); set.add('A'); set.add('E'); set.add('I'); set.add('O'); set.add('U'); char[] character = s.toCharArray(); int a_pointer = 0; int b_pointer = s.length() - 1; while (a_pointer < b_pointer) { if (set.contains(character[a_pointer]) && set.contains(character[b_pointer])) { char temp = character[a_pointer]; character[a_pointer] = character[b_pointer]; character[b_pointer] = temp; // 交换完成后手动移动双指针,避免死循环 a_pointer++; b_pointer--; } else if (!set.contains(character[a_pointer])) { a_pointer++; } else { b_pointer--; } } return new String(character); } }
内容的提问来源于stack exchange,提问作者Kihoon David Choi
相关产品推荐
相关产品推荐

