???? 算法题 ???? |
---|
???? 算法题 ???? |
---|
给你一个字符串 s ,仅反转字符串中的所有元音字母,并返回结果字符串。
元音字母包括 ‘a’、‘e’、‘i’、‘o’、‘u’,且可能以大小写两种形式出现。
示例1:
输入:s = "hello"
输出:"holle"
示例2:
输入:s = "leetcode"
输出:"leotcede"
提示:
首尾指针一同向中间移动,交换元素
代码:
public class Solution {
public string ReverseVowels(string s) {
int n = s.Length;
char[] arr = s.ToCharArray();
int i = 0, j = n - 1;
while (i < j) {
while (i < n && !IsVowel(arr[i])) {
++i;
}
while (j > 0 && !IsVowel(arr[j])) {
--j;
}
if (i < j) {
Swap(arr, i, j);
++i;
--j;
}
}
return new string(arr);
}
public bool IsVowel(char ch) {
return "aeiouAEIOU".IndexOf(ch) >= 0;
}
public void Swap(char[] arr, int i, int j) {
char temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
执行结果
通过
执行用时:84 ms,在所有 Java 提交中击败了72.50%的用户
内存消耗:39.4 MB,在所有 Java 提交中击败了5.50%的用户
思路解析
可以使用两个指针 i 和 j对字符串相向地进行遍历。
具体地,指针 i 初始时指向字符串 s 的首位,指针 j 初始时指向字符串 s 的末位。
在遍历的过程中,我们不停地将 i 向右移动,直到 i 指向一个元音字母(或者超出字符串的边界范围); 同时,我们不停地将 j 向左移动,直到 j 指向一个元音字母。
此时,如果 i
代码:
class Solution {
public String reverseVowels(String s) {
int n = s.length();
char[] arr = s.toCharArray();
int i = 0, j = n - 1;
while (i < j) {
while (i < n && !isVowel(arr[i])) {
++i;
}
while (j > 0 && !isVowel(arr[j])) {
--j;
}
if (i < j) {
swap(arr, i, j);
++i;
--j;
}
}
return new String(arr);
}
public boolean isVowel(char ch) {
return "aeiouAEIOU".indexOf(ch) >= 0;
}
public void swap(char[] arr, int i, int j) {
char temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
执行结果
通过
执行用时:3 ms,在所有 Java 提交中击败了81.26%的用户
内存消耗:38.2 MB,在所有 Java 提交中击败了63.05%的用户
复杂度分析
时间复杂度:O( n )
空间复杂度:O( 1 )
C#
和 Java
两种编程语言进行解题