2021-08-19leetcode刷题——345、反转字符串中的元音字母

【微信公众号:yi极】

反转字符串中的元音字母

题目描述:

给你一个字符串 s ,仅反转字符串中的所有元音字母,并返回结果字符串。
元音字母包括 'a'、'e'、'i'、'o'、'u',且可能以大小写两种形式出现。

方法1:

思路:
在HashSet中放入所有元音字母的大小写,将字符串转化成字符数组中处理,两个变量分别指向数组第一个和最后一个元素,分别寻找是否有元音字母找到就相互交换。最后将数组转换成字符串返回。

class Solution1 {
    /*
     * 执行用时: 3 ms
     * 内存消耗: 38.7 MB
     * */
    private static HashSet vowels = new HashSet(){{
        add('a');
        add('A');
        add('e');
        add('E');
        add('i');
        add('I');
        add('o');
        add('O');
        add('u');
        add('U');
    }};//将元素存储到set中
    
    public static String reverseVowels(String s) {

        int i = 0;
        int j = s.length()-1;
        
        char [] ch = s.toCharArray();
        
        while(i < j){
            while( i < j && !vowels.contains( ch[i] )){
                i++;
            }
            while( i < j && !vowels.contains( ch[j] )){
                j--;
            }
            if ( ch[i] != ch[j] ){
                char temp = ch[i];
                ch[i] = ch[j];
                ch[j] = temp;
            }
            i++;
            j--;
        }
        
        return String.valueOf(ch);
    }
}

注意:Java中HashSet的使用

HashSet类位于 java.util 包中,HashSet类用于创建使用哈希表进行存储的集合。它继承了AbstractSet类并实现Set接口。

HashSet有如下特点:

HashSet 基于 HashMap 来实现的,是一个不允许有重复元素的集合。
HashSet 允许有 null 值。
HashSet 是无序的,即不会记录插入的顺序。因为元素是根据其哈希码插入的。
HashSet 实现了 Set 接口
HashSet 通过使用一种称为哈希的机制来存储元素。
HashSet 方便检索数据。
HashSet 的初始默认容量为16,而负载因子为0.75。
HashSet 类是非同步的(线程不安全)。如果多个线程尝试同时修改 HashSet,则最终结果是不确定的。 必须在多线程访问时显式同步对 HashSet 的并发访问。

HashSet有如下方法:

add(E e) 向Set集合中添加元素,添加成功返回true,否则返回false。
isEmpty() 如果HashSet不包含元素返回true,否则返回false。
size() 返回获取HashSet中的元素个数。
contains(Object o) 如果HashSet中找到指定元素,返回true,否则返回false。
iterator() 用于返回用于遍历HashSet元素的迭代器对象。迭代器可以从HashSet中存在的元素开始以随机顺序返回元素。
remove(Object o) 如果指定元素存在于此 set 中,则将其移除。
clear() 用于从集中删除所有元素。

public static void main(String[] args) {
    
    HashSet hashSet = new HashSet();
    
    hashSet.add("AAA");
    hashSet.add("BBB");
    hashSet.add("CCC");
    hashSet.add("DDD");
    hashSet.add("EEE");
    
    System.out.println("The size of the set is "+hashSet.size());//The size of the set is 5

    System.out.println( String.valueOf(hashSet.contains("BBB")) );//true
    
    hashSet.remove("DDD");
    
    //使用迭代器获取输出内容
    Iterator iterator = hashSet.iterator();
    
    while(iterator.hasNext()){
        System.out.printf("%s",iterator.next());//AAACCCBBBEEE
    }
    System.out.println();
    
    hashSet.clear();
    
    if (hashSet.isEmpty()){
        System.out.println("The set is empty");//The set is empty
    } else {
        System.out.println("The set is not empty");
    }
}

方法2:

思路:
将字符串转化成字符数组中处理,两个变量分别指向数组第一个和最后一个元素,分别寻找是否有元音字母找到就相互交换。最后将数组转换成字符串返回。

class Solution2 {
    /*
     * 执行用时: 3 ms
     * 内存消耗: 38.5 MB
     * */
    private static boolean vowel(char ch){
        
        ch = Character.toLowerCase(ch);
        
        return ch == 'a' || ch == 'e' || ch == 'i' || ch == 'o' || ch == 'u';
    }
    
    public static String reverseVowels(String s) {
        
        int l = 0;
        int r = s.length()-1;
        
        char [] arr = s.toCharArray();
        
        while(l < r){
           while(l < r && !vowel(arr[l])){
               l++;
           }
           while(l < r && !vowel(arr[r])){
               r--;
           }
           if (l < r){
               
               char temp = arr[l];
               arr[l] = arr[r];
               arr[r] = temp;
               
               l++;
               r--;
           }
        }
        
        return new String(arr);
    }

注意:Java中toLowerCase()、toUpperCase() 的使用

toLowerCase是将所有的英文字符转换为小写字母
toUpperCase是将所有的英文字符转换为大写字母

public static void main(String[] args) {
    
    String str = "Synchronized";
    
    System.out.println(str.toLowerCase());//synchronized
    System.out.println(str.toUpperCase());//SYNCHRONIZED
}

测试代码:

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    
    System.out.printf("请输入字符串s = ");
    String s = sc.nextLine();
    
    System.out.println(reverseVowels(s));
}

运行结果:
屏幕截图1.png
屏幕截图2.png

你可能感兴趣的:(2021-08-19leetcode刷题——345、反转字符串中的元音字母)