lc345. 反转字符串中的元音字母

lc345. 反转字符串中的元音字母_第1张图片

 元音字母按照从外到内成对的方式反转,不考虑出现的元音字母个数为奇数的情况

双指针:指针1由左向右遍历,指针2由右向左遍历,某个指针指向元音字母时停止,直到它另一个指针也指向元音字母,此时两个指针指向的字母发生交换,交换后,再次按原来的方向遍历,如果指针2 < 指针1,那么说明整个字符串都被遍历,结束遍历

对于交换的条件:一开始的想法是vowel.indexOf(str[i]) >= 0 && vowel.indexOf(str[j]) >= 0 。因为结束条件有外围的 i < j 保证,跑出来发现不对。在交换后i+1,j-1后仍然保持 i < j ,进入循环,进入循环的后一轮i增加、j减少,i > j,i遇到处于后面的元音字母,j遇到处于前面的元音字母,此时二者再次发生交换,交换两次=没交换。所以交换的条件为i < j

代码

import org.junit.Test;


public class RollbackVowel {

    @Test
    public void test() {
        String s = "hello";
        String s1 = "leetcode";
        System.out.println(rollbackVowel(s));
        System.out.println(rollbackVowel(s1));
    }


    //vowel.indexOf(str[i]) >= 0表示str[i]上的字符是元音字母
    //vowel.indexOf(str[i]) < 0表示str[i]上的字符不是元音字母
    public static String rollbackVowel(String string) {
        String vowel = "aeiouAEIOU";
        char[] str = string.toCharArray();

        int i = 0, j = str.length - 1;
        while (i < j) {
            while (i < str.length && vowel.indexOf(str[i]) < 0) {
                i++;
            }

            while (j > 0 && vowel.indexOf(str[j]) < 0) {
                j--;
            }

            if (i < j) {
                swap(str, i, j);
                i++;
                j--;
            }
        }


        return new String(str);

    }

    public static void swap(char[] arr, int i, int j) {
        char temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
}

你可能感兴趣的:(数据结构)