计算字符串中每种字符出现的次数[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

  

  最后总结:

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

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

posted @ 2015-09-22 21:57  苏打兴  阅读(450)  评论(0编辑  收藏  举报