C#LeetCode刷题之#345-反转字符串中的元音字母(Reverse Vowels of a String)
问题
该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/3935 访问。
编写一个函数,以字符串作为输入,反转该字符串中的元音字母。
输入: "hello"
输出: "holle"
输入: "leetcode"
输出: "leotcede"
说明:元音字母不包含字母"y"。
Write a function that takes a string as input and reverse only the vowels of a string.
Given s = "hello", return "holle".
Given s = "leetcode", return "leotcede".
Note:The vowels does not include the letter "y".
示例
该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/3935 访问。
public class Program {
    public static void Main(string[] args) {
        var s = "holle";
        var res = ReverseVowels(s);
        Console.WriteLine(res);
        s = "leotcede";
        res = ReverseVowels2(s);
        Console.WriteLine(res);
        Console.ReadKey();
    }
    private static string ReverseVowels(string s) {
        //暴力解法
        //LeetCode超时未AC
        //记录元音字母
        var vowels = new List<char>() {
            'a','e','i','o','u',
            'A','E','I','O','U'
        };
        //字典记录所有元音字母及位置
        var dic = new Dictionary<int, char>();
        for(var i = 0; i < s.Length; i++) {
            if(vowels.Contains(s[i])) {
                dic[i] = s[i];
            }
        }
        //两两前后交换所有元音值
        for(var i = 0; i < dic.Count / 2; i++) {
            var key1 = dic.ElementAt(i).Key;
            var key2 = dic.ElementAt(dic.Count - i - 1).Key;
            var swap = dic[key1];
            dic[key1] = dic[key2];
            dic[key2] = swap;
        }
        //重新规划元音字符串顺序
        var res = new StringBuilder(s);
        foreach(var item in dic) {
            res[item.Key] = item.Value;
        }
        //返回结果
        return res.ToString();
    }
    private static string ReverseVowels2(string s) {
        //双指针法
        //记录元音字母
        var vowels = new List<char>() {
            'a','e','i','o','u',
            'A','E','I','O','U'
        };
        //转换成 char 数组
        //因为 C# 的字符串索引器是只读的,所以这是必须的
        var chars = s.ToCharArray();
        //前后双指针法
        var i = 0;
        var j = s.Length - 1;
        //循环直到指针碰撞时为止
        while(i < j) {
            //从左向右找到元音字符
            while(i < j && !vowels.Contains(chars[i])) i++;
            //从右向左找到元音字符
            while(i < j && !vowels.Contains(chars[j])) j--;
            //交换它们,注意这里的条件是必须的
            if(i < j) {
                var swap = chars[i];
                chars[i++] = chars[j];
                chars[j--] = swap;
            }
        }
        //返回结果
        return new string(chars);
    }
}以上给出2种算法实现,以下是这个案例的输出结果:
该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/3935 访问。
hello
leetcode分析:
显而易见,以上2种算法的时间复杂度均为:  。
C#LeetCode刷题之#345-反转字符串中的元音字母(Reverse Vowels of a String)的更多相关文章
- [Swift]LeetCode345. 反转字符串中的元音字母 | Reverse Vowels of a String
		Write a function that takes a string as input and reverse only the vowels of a string. Example 1: In ... 
- Java实现 LeetCode 345 反转字符串中的元音字母
		345. 反转字符串中的元音字母 编写一个函数,以字符串作为输入,反转该字符串中的元音字母. 示例 1: 输入: "hello" 输出: "holle" 示例 ... 
- Leetcode 345. 反转字符串中的元音字母 By Python
		编写一个函数,以字符串作为输入,反转该字符串中的元音字母. 示例 1: 输入: "hello" 输出: "holle" 示例 2: 输入: "leet ... 
- LeetCode:反转字符串中的元音字母【345】
		LeetCode:反转字符串中的元音字母[345] 题目描述 编写一个函数,以字符串作为输入,反转该字符串中的元音字母. 示例 1: 输入: "hello" 输出: "h ... 
- 【leetcode 简单】 第八十三题 反转字符串中的元音字母
		编写一个函数,以字符串作为输入,反转该字符串中的元音字母. 示例 1: 输入: "hello" 输出: "holle" 示例 2: 输入: "leet ... 
- 345 Reverse Vowels of a String 反转字符串中的元音字母
		编写一个函数,以字符串作为输入,反转该字符串中的元音字母.示例 1:给定 s = "hello", 返回 "holle".示例 2:给定 s = "l ... 
- C#LeetCode刷题之#557-反转字符串中的单词 III(Reverse Words in a String III)
		问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3955 访问. 给定一个字符串,你需要反转字符串中每个单词的字符顺 ... 
- leetCode题解之反转字符串中的元音字母
		1.问题描述 Reverse Vowels of a String Write a function that takes a string as input and reverse only the ... 
- LeetCode 557:反转字符串中的单词 III  Reverse Words in a String III
		公众号:爱写bug(ID:icodebugs) 给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序. Given a string, you need to reve ... 
随机推荐
- 静态代理,动态代理和CGLIB代理模式
			代理模式 一.概述 代理是一种模式,提供了对目标对象的间接访问方式,即通过代理访问目标对象.如此便于在目标实现的基础上增加额外的功能操作,前拦截,后拦截等,以满足自身的业务需求,同时代理模式便于扩展目 ... 
- CentOS8.0  Docker  Repository
			一.硬件软件准备 1.2台服务器或者电脑(使用云服务器1.阿里云 2.百度云各一台) ,系统均为CentOS 8.0 2.分别安装Docker 3.测试镜像准备(准备的是 ... 
- Vuex里的module选项和移动端布局
			Vuex里的modules 在store文件夹里创建一个modules的文件夹,里面随意创建一个.js文件,然后export输出 
- 016.Nginx HTTPS
			一 HTTPS概述 1.1 HTTPS介绍 超文本传输安全协议HTTPS(Hypertext Transfer Protocol Secure)是超文本传输协议和SSL/TLS的组合,用以提供加密通讯 ... 
- 简单了解InnoDB底层原理
			存储引擎 很多文章都是直接开始介绍有哪些存储引擎,并没有去介绍存储引擎本身.那么究竟什么是存储引擎?不知道大家有没有想过,MySQL是如何存储我们丢进去的数据的? 其实存储引擎也很简单,我认为就是一种 ... 
- 线程_进程间通信Queue合集
			# Queue的工作原理 from multiprocessing import Queue q = Queue(3)#初始化一个Queue对象,最多可接收3条put消息 q.put("In ... 
- 4-Pandas之数据类型与数据筛选
			一.数据类型 1.Pandas的数据类型主要结合了pandas和numpy两个模块中的数据类型,包括以下几种: float int bool datetime64[ns]------>日期类型 ... 
- 使用 MySQLi 和 PDO 向 MySQL 插入数据
			PHP MySQL 插入数据 使用 MySQLi 和 PDO 向 MySQL 插入数据 在创建完数据库和表后,我们可以向表中添加数据. 以下为一些语法规则: PHP 中 SQL 查询语句必须使用引号 ... 
- PHP curl_share_setopt函数
			(PHP 5 >= 5.5.0) curl_share_setopt — 设置 cURL 共享句柄的一个选项. 说明 bool curl_share_setopt ( resource $sh ... 
- luogu P4726 【模板】多项式指数函数 多项式 exp 牛顿迭代 泰勒展开
			LINK:多项式 exp 做多项式的题 简直在嗑药. 前置只是 泰勒展开 这个东西用于 对于一个函数f(x) 我们不好得到 其在x处的取值. 所以另外设一个函数g(x) 来在x点处无限逼近f(x). ... 
