【微信公眾號:yi極】
反轉(zhuǎn)字符串中的元音字母
題目描述:
給你一個字符串 s 奥溺,僅反轉(zhuǎn)字符串中的所有元音字母辞色,并返回結(jié)果字符串。
元音字母包括 'a'、'e'相满、'i'层亿、'o'、'u'立美,且可能以大小寫兩種形式出現(xiàn)匿又。
方法1:
思路:
在HashSet中放入所有元音字母的大小寫,將字符串轉(zhuǎn)化成字符數(shù)組中處理建蹄,兩個變量分別指向數(shù)組第一個和最后一個元素碌更,分別尋找是否有元音字母找到就相互交換。最后將數(shù)組轉(zhuǎn)換成字符串返回洞慎。
class Solution1 {
/*
* 執(zhí)行用時: 3 ms
* 內(nèi)存消耗: 38.7 MB
* */
private static HashSet<Character> vowels = new HashSet<Character>(){{
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類用于創(chuàng)建使用哈希表進行存儲的集合。它繼承了AbstractSet類并實現(xiàn)Set接口劲腿。
HashSet有如下特點:
HashSet 基于 HashMap 來實現(xiàn)的旭绒,是一個不允許有重復元素的集合。
HashSet 允許有 null 值焦人。
HashSet 是無序的挥吵,即不會記錄插入的順序。因為元素是根據(jù)其哈希碼插入的花椭。
HashSet 實現(xiàn)了 Set 接口
HashSet 通過使用一種稱為哈希的機制來存儲元素忽匈。
HashSet 方便檢索數(shù)據(jù)。
HashSet 的初始默認容量為16矿辽,而負載因子為0.75丹允。
HashSet 類是非同步的(線程不安全)。如果多個線程嘗試同時修改 HashSet袋倔,則最終結(jié)果是不確定的嫌松。 必須在多線程訪問時顯式同步對 HashSet 的并發(fā)訪問。
HashSet有如下方法:
add(E e) 向Set集合中添加元素奕污,添加成功返回true,否則返回false液走。
isEmpty() 如果HashSet不包含元素返回true碳默,否則返回false。
size() 返回獲取HashSet中的元素個數(shù)缘眶。
contains(Object o) 如果HashSet中找到指定元素嘱根,返回true,否則返回false巷懈。
iterator() 用于返回用于遍歷HashSet元素的迭代器對象该抒。迭代器可以從HashSet中存在的元素開始以隨機順序返回元素。
remove(Object o) 如果指定元素存在于此 set 中顶燕,則將其移除凑保。
clear() 用于從集中刪除所有元素冈爹。
public static void main(String[] args) {
HashSet<String> hashSet = new HashSet<String>();
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");
//使用迭代器獲取輸出內(nèi)容
Iterator<String> 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:
思路:
將字符串轉(zhuǎn)化成字符數(shù)組中處理,兩個變量分別指向數(shù)組第一個和最后一個元素欧引,分別尋找是否有元音字母找到就相互交換频伤。最后將數(shù)組轉(zhuǎn)換成字符串返回。
class Solution2 {
/*
* 執(zhí)行用時: 3 ms
* 內(nèi)存消耗: 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是將所有的英文字符轉(zhuǎn)換為小寫字母
toUpperCase是將所有的英文字符轉(zhuǎn)換為大寫字母
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));
}
運行結(jié)果: