• 计算字符串中每种字符出现的次数[Dictionary<char,int>泛型集合用法]


      有一道经典的面试题: 统计 welcome to china中每个字符出现的次数,不考虑大小写。

            第一个出现在脑海里的想法是:

        1. 将字字符串转换成 char数组;

        2. 用 for循环遍历每个字符,根据switch-case语句来逐一判断。

        3. 再建立一个 int 数组来接收判断后的结果,最后 for 循环输出。

      这样做的话,就要写很多个case语句来判断每个字符出现的情况。假如题目改变一下,这个字符串由用户输入,而不是固定的,那么要写的case语句会更多,恐怕整张试卷都写不下了。就算你写出来了,面试官看到了岂不是当场走人,汗汗汗汗。这绝对不是最佳的解法。

      

      使用泛型集合来解决吧。

      解题思路:

        1. 假如不考虑大小写的话,就要先将字符串中所有的字母先转换为小写(同理转换为大写也行)

        2. 将这个字符串转换为字符数组

        3. 建立一个键值对集合 Dictionary<char, int> dicChars ,字符作为 key ,字符出现的次数作为 value

        4. 循环遍历字符串数组,如果某个字符在dicChars中没有出现过,就将它插入集合中,出现的次数设为 1

                    如果某个字符在dicChars中已经出现过,就将它出现的次数加1即可

                    如果要忽略空格的话,就要先判断遇到的是否是空格,如果是的话,就continue,跳过吧。

        5. 通过foreach循环,以KeyValuePair<char,int> 来遍历集合,将每个字符出现的次数显示出来 

     1             //统计 welcome to china中每个字符出现的次数,不考虑大小写
     2             string str = "welcome to china";
     3             str = str.ToLower(); //先将所有字母都转为小写,以此忽略大小写
     4             char[] charArray = str.ToCharArray();
     5             Dictionary<char, int> dicChars = new Dictionary<char,int>();
     6             
     7             for (int i = 0; i < charArray.Length; i++)
     8             {
     9                 char key = charArray[i];
    10                 //忽略空格
    11                 if (key == ' ')
    12                 {
    13                     continue;
    14                 }
    15 
    16                 if (!dicChars.ContainsKey(key)) //如果不包含这个字符,则将字符加入集合中
    17                 {
    18                     dicChars.Add(key, 1);
    19                 }
    20                 else
    21                 {
    22                     dicChars[key]++;
    23                 }
    24             }
    25 
    26             Console.WriteLine("在 welcome to china中每个字符出现的次数:");
    27             foreach (KeyValuePair<char,int> kv in dicChars)
    28             {
    29                 Console.WriteLine("{0}出现了{1}次 ", kv.Key, kv.Value);
    30             }
    View Code

      

      最后总结:

        个人认为,遇到一个新的问题的时候,关键是思路,把思路一步一步理顺了,就像我们老师说的那样,知道你要干什么,想好怎样去做,最后再去写代码。不要

      一上来就敲代码,思路都没搞清楚呢,最后肯定是问题多多。

  • 相关阅读:
    [BZOJ3413]匹配
    [BZOJ3879]SvT
    [BZOJ1339] [Baltic2008] Mafia / 黑手党
    [BZOJ1834] [ZJOI2010] network 网络扩容
    [BZOJ1449] [JSOI2009]球队收益 / [BZOJ2895] 球队预算
    [BZOJ2597] [WC2007]剪刀石头布
    [BZOJ1283]序列
    [BZOJ2127]happiness
    Java公开课-04.异常
    Java公开课-03.内部类
  • 原文地址:https://www.cnblogs.com/lcxBlog/p/4830629.html
Copyright © 2020-2023  润新知