- 相關(guān)推薦
關(guān)于一道.NET程序員面試題的遐想
前幾天,同學(xué)問(wèn)了我一道程序員的面試題,題目是 “統計用戶(hù)輸入的一串數字中每個(gè)數字出現的次數”。
當時(shí)看到這個(gè)題目,我的第一想法就是:
1.先判斷用戶(hù)輸入的是否是數字,用if-else語(yǔ)句來(lái)判斷;
2.將用戶(hù)輸入的數字字符串轉換成char數組;
3.用for循環(huán)遍歷每個(gè)字符,根據switch-case語(yǔ)句來(lái)逐一判斷。
4.再建立一個(gè)int數組來(lái)接收判斷后的結果,最后for循環(huán)輸出。
該方法的解題代碼如下:
View Code
classprogram
{
staticvoidMain(string[]args)
{
//計算用戶(hù)輸入的一串數字中每個(gè)數字出現的次數
Console.WriteLine("請輸入一串數字");
stringstr=Console.ReadLine();
//將字符串轉換為字符數組
char[]chnum=str.ToCharArray();
#region判斷用戶(hù)輸入的是否是數字
for(inti=0;i
{//判斷每一個(gè)字符是否是數字通過(guò)char的方法來(lái)判斷
if(!char.IsNumber(chnum[i]))
{
Console.WriteLine("您的輸入有誤,請輸入數字");
Console.ReadKey();
return;
}
}
#endregion
//定義一個(gè)新的數組來(lái)保存計數
int[]count=newint[9];
#regionfor循環(huán)遍歷
//for循環(huán)遍歷
for(inti=0;i{
switch(chnum[i])
{
case1:
count[0]++;
break;
case2:
count[1]++;
break;
case3:
count[2]++;
break;
case4:
count[3]++;
break;
case5:
count[4]++;
break;
case6:
count[5]++;
break;
case7:
count[6]++;
break;
case8:
count[7]++;
break;
case9:
count[8]++;
break;
}
}
#endregion
#region循環(huán)輸出
for(inti=0;i{
Console.WriteLine("含有的數字{0}的個(gè)數是:{1}",i+1,count[i]);
}
#endregion
Console.ReadKey();
}
}
運行效果如下:
不過(guò),這種方法有兩個(gè)缺點(diǎn)就是,如果用戶(hù)輸入的不是數字(如字母或符號等),程序會(huì )提示錯誤,并退出;再者,也會(huì )統計出用戶(hù)沒(méi)有輸入過(guò)的數字的個(gè)數為0個(gè),如果某些時(shí)候不想知道沒(méi)有輸入的數字的個(gè)數,這種解法很不合適,而且代碼修改起來(lái)也很復雜。
新解法: 泛型集合
碰巧這幾天接觸了泛型集合,沒(méi)想到用Dictionary來(lái)解這道題是那么的簡(jiǎn)單。
代碼如下:
View Code
classprogram
{
staticvoidMain(string[]args)
{
Console.WriteLine("請輸入數字");
stringnumbers=Console.ReadLine();
//創(chuàng )建集合鍵為數字char類(lèi)型值為每個(gè)數字出現的次數int類(lèi)型
Dictionarydict=newDictionary();
//將數字字符串轉換為單個(gè)字符數組
char[]chs=numbers.ToCharArray();
for(inti=0;i{
//判斷是否是數字用到char的isnumber方法
if(char.IsNumber(chs[i]))
{
//如果鍵中已含有該數字,則將其對應的值+1,否則不存在,加入鍵中值為1
if(!dict.ContainsKey(chs[i]))
{
//將每個(gè)數字字符作為鍵存入鍵值對中,值初始為1
dict.Add(chs[i],1);
}
else
{
//值+1
dict[chs[i]]++;
}
}
}
//循環(huán)遍歷鍵值對輸出
foreach(KeyValuepairitemindict)
{
Console.WriteLine("數字:{0}出現了{1}次。",item.Key,item.Value);
}
Console.ReadKey();
復制代碼
可見(jiàn),簡(jiǎn)單的幾行代碼就解決了。
而且,這種解法完全解決了上面遇到的兩個(gè)問(wèn)題。
我覺(jué)得這個(gè)應該就是面試官想要的效果吧。(汗。。。不知道我那位同學(xué)的面試情況怎么樣。。。)
寫(xiě)到這里,我又想到了見(jiàn)過(guò)的另一道面試題:“計算字符串中每種字符出現的次數”。
這要用我開(kāi)始想到的那種思路來(lái)解得話(huà),我豈不是要寫(xiě)26個(gè)case語(yǔ)句來(lái)判斷嗎,汗。。。。不知道面試官要是看到這么多代碼豈不是會(huì )當場(chǎng)走人。。。顯然這不是最好的解題辦法。
還是用泛型集合來(lái)解:
View Code
classprogram
{
staticvoidMain(string[]args)
{
//計算字符串中每種字符出現的次數(面試題)。
//“WelcometoChina,beijing”,
//不區分大小寫(xiě),打印“W2”“e2”“o3”……
/*思路:1將字符串都轉換為小寫(xiě)形式,否則大小寫(xiě)會(huì )算各一個(gè)
*2以字符為鍵每個(gè)字符出現的次數為值建立Dictionary泛型集合
*3將字符串轉換為字符數組
*4循環(huán)遍歷每個(gè)字符,加入集合中作為鍵,其對應的值初始為1
*5在加入鍵之前做一個(gè)判斷,由于集合中的鍵不能重復,所以判斷如果鍵中已經(jīng)還有該字符
*則不再加入該鍵,只把他的值+1
*6去除字符串中的空格char.isLetter()如果是字母,進(jìn)行操作5
*7總結:主要是泛型集合的應用
*/
//例句:
//stringsentences="WelcometoChina,beijing";
Console.WriteLine("請輸入一段字母");
stringsentences=Console.ReadLine();
//將字符串都轉換為小寫(xiě)形式
sentences=sentences.ToLower();
//建立泛型集合
Dictionarydict=newDictionary();
//將字符串變成字符數組
char[]chs=sentences.ToCharArray();
//遍歷每一個(gè)字符
for(inti=0;i{
//通過(guò)char的方法判斷是否為字母,如果為字母,則進(jìn)行下面的操作,
//否則不操作
if(char.IsLetter(chs[i]))
{
//如果不包含該鍵,則加入集合中
if(!dict.ContainsKey(chs[i]))
{
//將每個(gè)字符加入集合中對應鍵,其值初始為1
dict.Add(chs[i],1);
}
else
{
//否則,包含該鍵,只將其對應的值+1即可值的類(lèi)型為int
//dict[chs[i]]=dict[chs[i]]+1;
dict[chs[i]]++;
}
}
}
//循環(huán)遍歷輸出集合中的鍵值
foreach(KeyValuepairkvindict)
{
Console.WriteLine("字母:{0}出現了{1}次。",kv.Key,kv.Value);
}
Console.ReadKey();
}
}
同樣,代碼很簡(jiǎn)單:
這時(shí),我又突發(fā)奇想想到了另一種情況:
用戶(hù)輸入一串字母和數字的混合字符串如“ddeieiei4954jjfjdji383ddjeuut3003k”
統計出每個(gè)數字或字母出現的次數,且數字在前,字母在后 ,數字和字母內沒(méi)有順序要求
如 數字 4 出現了 2次
數字 3 出現了 4次
.......
........
字母 d 出現了 5次
...........
當然,最簡(jiǎn)單的還是用泛型集合來(lái)解了。。。。
最后來(lái)個(gè)總結吧:
個(gè)人認為,遇到一個(gè)新的問(wèn)題的時(shí)候,關(guān)鍵是思路,把思路一步一步理順了,就像我們老師說(shuō)的那樣,知道你要干什么,想好怎樣去做,最后再去寫(xiě)代碼。不要一上來(lái)就敲代碼,思路都沒(méi)搞清楚呢,最后肯定是問(wèn)題多多。
希望這篇文章可以給像我這樣正在找工作的應屆生一些小小的幫助吧!
(突然覺(jué)得在大學(xué)里學(xué)的那些知識都太簡(jiǎn)單了,而且太深了也不講。找工作時(shí)真的很無(wú)奈啊!!!)
【一道.NET程序員面試題的遐想】相關(guān)文章:
2011最新asp.net面試題與答案07-11
一道騰訊的面試題07-09
程序員面試題精選07-12
一道Java面試題,題目如下07-11
女本 計算機專(zhuān)業(yè)想做net程序員難不難?07-10
入門(mén)級PHP程序員面試題07-09
一道很不錯的人力資源面試題07-11
誰(shuí)有近幾年華為和中興公司的Java程序員面試題07-11
WAP網(wǎng)絡(luò )與NET網(wǎng)絡(luò )的區別于定義!07-10
京東為什么在用.net07-11