當時看到這個題目,我的第一想法就是:
1.先判斷用戶輸入的是否是數字,用if-else語句來判斷;
2.將用戶輸入的數字字符串轉換成char數組;
3.用for循環遍歷每個字符,根據switch-case語句來逐一判斷。
4.再建立一個int數組來接收判斷后的結果,最后for循環輸出。
class Program
{
static void Main(string[] args)
{
//計算用戶輸入的一串數字中每個數字出現的次數
Console.WriteLine("請輸入一串數字");
string str = Console.ReadLine();
// 將字符串轉換為字符數組
char[] chnum = str.ToCharArray();
#region 判斷用戶輸入的是否是數字
for ( int i = 0; i < chnum.Length; i++)
{ // 判斷每一個字符是否是數字 通過char的方法來判斷
if (! char.IsNumber(chnum[i]))
{
Console.WriteLine( " 您的輸入有誤,請輸入數字 ");
Console.ReadKey();
return;
}
}
#endregion
// 定義一個新的數組來保存計數
int[] count= new int[ 9];
#region for循環遍歷
// for循環遍歷
for ( int i = 0; i < chnum.Length; i++)
{
switch (chnum[i])
{
case ' 1 ':
count[ 0]++;
break;
case ' 2 ':
count[ 1]++;
break;
case ' 3 ':
count[ 2]++;
break;
case ' 4 ':
count[ 3]++;
break;
case ' 5 ':
count[ 4]++;
break;
case ' 6 ':
count[ 5]++;
break;
case ' 7 ':
count[ 6]++;
break;
case ' 8 ':
count[ 7]++;
break;
case ' 9 ':
count[ 8]++;
break;
}
}
#endregion
#region 循環輸出
for ( int i = 0; i < count.Length; i++)
{
Console.WriteLine( " 含有的數字 {0} 的個數是:{1} ", i + 1, count[i]);
}
#endregion
Console.ReadKey();
}
}
運行效果如下:
不過,這種方法有兩個缺點就是,如果用戶輸入的不是數字(如字母或符號等),程序會提示錯誤,並退出;再者,也會統計出用戶沒有輸入過的數字的個數為0個,如果某些時候不想知道沒有輸入的數字的個數,這種解法很不合適,而且代碼修改起來也很復雜。
新解法: 泛型集合
碰巧這幾天接觸了泛型集合,沒想到用Dictionary來解這道題是那么的簡單。
代碼如下:
class Program
{
static void Main(string[] args)
{
Console.WriteLine("請輸入數字");
string numbers = Console.ReadLine();
//創建集合 鍵 為數字 char類型 值為每個數字出現的次數 int類型
Dictionary<char, int> dict = new Dictionary<char, int>();
//將數字字符串轉換為單個字符數組
char[] chs = numbers.ToCharArray();
for (int i = 0; i < chs.Length; i++)
{
//判斷是否是數字 用到char的isnumber方法
if (char.IsNumber(chs[i]))
{
//如果鍵中已含有該數字,則將其對應的值+1,否則不存在,加入鍵中 值為1
if (!dict.ContainsKey(chs[i]))
{
//將每個數字字符作為鍵 存入 鍵值對中, 值初始為1
dict.Add(chs[i], 1);
}
else
{
//值+1
dict[chs[i]]++;
}
}
}
//循環遍歷鍵值對輸出
foreach (KeyValuePair<char,int> item in dict)
{
Console.WriteLine("數字:{0}出現了{1}次。",item.Key,item.Value);
}
Console.ReadKey();
可見,簡單的幾行代碼就解決了。
而且,這種解法完全解決了上面遇到的兩個問題。
我覺得這個應該就是面試官想要的效果吧。(汗。。。不知道我那位同學的面試情況怎么樣。。。)
寫到這里,我又想到了見過的另一道面試題:“計算字符串中每種字符出現的次數”。
這要用我開始想到的那種思路來解得話,我豈不是要寫26個case語句來判斷嗎,汗。。。。不知道面試官要是看到這么多代碼豈不是會當場走人。。。顯然這不是最好的解題辦法。
還是用泛型集合來解:
{
static void Main( string[] args)
{
// 計算字符串中每種字符出現的次數(面試題)。
// “Welcome to China , beijing”,
// 不區分大小寫,打印“W2”“e 2”“o 3”……
/* 思路:1 將字符串都轉換為小寫形式,否則 大小寫會算各一個
* 2 以字符為鍵 每個字符出現的次數為值 建立 Dictionary<char,int>泛型集合
* 3 將字符串轉換為字符數組
* 4 循環遍歷每個字符,加入集合中作為鍵,其對應的值初始為1
* 5 在加入鍵之前做一個判斷,由於集合中的鍵不能重復,所以判斷如果鍵中已經還有該字符
* 則不再加入該鍵,只把他的值+1
* 6 去除字符串中的空格 char.isLetter() 如果是字母,進行操作5
* 7 總結:主要是泛型集合的應用
*/
// 例句:
// string sentences="Welcome to China , beijing";
Console.WriteLine( " 請輸入一段字母 ");
string sentences = Console.ReadLine();
// 將字符串都轉換為小寫形式
sentences = sentences.ToLower();
// 建立泛型集合
Dictionary< char, int> dict= new Dictionary< char, int>();
// 將字符串變成字符數組
char[] chs=sentences.ToCharArray();
// 遍歷每一個字符
for ( int i = 0; i < chs.Length; i++)
{
// 通過char的方法判斷是否為字母,如果為字母,則進行下面的操作,
// 否則不操作
if ( char.IsLetter(chs[i]))
{
// 如果不包含該鍵,則加入集合中
if (!dict.ContainsKey(chs[i]))
{
// 將每個字符加入集合中對應鍵,其值初始為1
dict.Add(chs[i], 1);
}
else
{
// 否則,包含該鍵,只將其對應的值+1即可 值的類型為int
// dict[chs[i]] = dict[chs[i]] + 1;
dict[chs[i]]++;
}
}
}
// 循環遍歷輸出集合中的鍵 值
foreach (KeyValuePair< char, int> kv in dict)
{
Console.WriteLine( " 字母:{0}出現了{1}次。 ",kv.Key,kv.Value);
}
Console.ReadKey();
}
}
同樣,代碼很簡單:
這時,我又突發奇想想到了另一種情況:
用戶輸入一串字母和數字的混合字符串如“ddeieiei4954jjfjdji383ddjeuut3003k”
統計出每個數字或字母出現的次數,且數字在前,字母在后 ,數字和字母內沒有順序要求
如 數字 4 出現了 2次
數字 3 出現了 4次
.......
........
字母 d 出現了 5次
...........
當然,最簡單的還是用泛型集合來解了。。。。
最后來個總結吧:
個人認為,遇到一個新的問題的時候,關鍵是思路,把思路一步一步理順了,就像我們老師說的那樣,知道你要干什么,想好怎樣去做,最后再去寫代碼。不要一上來就敲代碼,思路都沒搞清楚呢,最后肯定是問題多多。
希望這篇文章可以給像我這樣正在找工作的應屆生一些小小的幫助吧!
(突然覺得在大學里學的那些知識都太簡單了,而且太深了也不講。找工作時真的很無奈啊!!!)