有一道经典的面试题: 统计 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> 来遍历集合,将每个字符出现的次数显示出来
//统计 welcome to china中每个字符出现的次数,不考虑大小写
string str = "welcome to china";
str = str.ToLower(); //先将所有字母都转为小写,以此忽略大小写
char[] charArray = str.ToCharArray();
Dictionary<char, int> dicChars = new Dictionary<char,int>(); for (int i = ; i < charArray.Length; i++)
{
char key = charArray[i];
//忽略空格
if (key == ' ')
{
continue;
} if (!dicChars.ContainsKey(key)) //如果不包含这个字符,则将字符加入集合中
{
dicChars.Add(key, );
}
else
{
dicChars[key]++;
}
} Console.WriteLine("在 welcome to china中每个字符出现的次数:");
foreach (KeyValuePair<char,int> kv in dicChars)
{
Console.WriteLine("{0}出现了{1}次 ", kv.Key, kv.Value);
}
最后总结:
个人认为,遇到一个新的问题的时候,关键是思路,把思路一步一步理顺了,就像我们老师说的那样,知道你要干什么,想好怎样去做,最后再去写代码。不要
一上来就敲代码,思路都没搞清楚呢,最后肯定是问题多多。