範文齋

位置:首頁 > 職場範文 > 面試

關於一道.NET程序員面試題的遐想

面試4.71K

前幾天,同學問了我一道程序員的面試題,題目是 “統計用戶輸入的一串數字中每個數字出現的次數”。

關於一道.NET程序員面試題的遐想

當時看到這個題目,我的第一想法就是:

1.先判斷用戶輸入的是否是數字,用if-else語句來判斷;

2.將用戶輸入的數字字符串轉換成char數組;

3.用for循環遍歷每個字符,根據switch-case語句來逐一判斷。

4.再建立一個int數組來接收判斷後的結果,最後for循環輸出。

該方法的解題代碼如下:

View Code

classprogram

{

staticvoidMain(string[]args)

{

//計算用戶輸入的一串數字中每個數字出現的次數

eLine("請輸入一串數字");

stringstr=Line();

//將字符串轉換爲字符數組

char[]chnum=arArray();

#region判斷用戶輸入的是否是數字

for(inti=0;i

{//判斷每一個字符是否是數字通過char的方法來判斷

if(!mber(chnum[i]))

{

eLine("您的輸入有誤,請輸入數字");

Key();

return;

}

}

#endregion

//定義一個新的數組來保存計數

int[]count=newint[9];

#regionfor循環遍歷

//for循環遍歷

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循環輸出

for(inti=0;i{

eLine("含有的數字{0}的個數是:{1}",i+1,count[i]);

}

#endregion

Key();

}

}

運行效果如下:

不過,這種方法有兩個缺點就是,如果用戶輸入的不是數字(如字母或符號等),程序會提示錯誤,並退出;再者,也會統計出用戶沒有輸入過的數字的個數爲0個,如果某些時候不想知道沒有輸入的數字的個數,這種解法很不合適,而且代碼修改起來也很複雜。

新解法: 泛型集合

碰巧這幾天接觸了泛型集合,沒想到用Dictionary來解這道題是那麼的簡單。

代碼如下:

View Code

classprogram

{

staticvoidMain(string[]args)

{

eLine("請輸入數字");

stringnumbers=Line();

//創建集合鍵爲數字char類型值爲每個數字出現的次數int類型

Dictionarydict=newDictionary();

//將數字字符串轉換爲單個字符數組

char[]chs=arArray();

for(inti=0;i{

//判斷是否是數字用到char的isnumber方法

if(mber(chs[i]))

{

//如果鍵中已含有該數字,則將其對應的值+1,否則不存在,加入鍵中值爲1

if(!ainsKey(chs[i]))

{

//將每個數字字符作爲鍵存入鍵值對中,值初始爲1

(chs[i],1);

}

else

{

//值+1

dict[chs[i]]++;

}

}

}

//循環遍歷鍵值對輸出

foreach(KeyValuepairitemindict)

{

eLine("數字:{0}出現了{1}次。",,e);

}

Key();

複製代碼

可見,簡單的幾行代碼就解決了。

而且,這種解法完全解決了上面遇到的兩個問題。

我覺得這個應該就是面試官想要的效果吧。(汗。。。不知道我那位同學的面試情況怎麼樣。。。)

寫到這裏,我又想到了見過的另一道面試題:“計算字符串中每種字符出現的次數”。

這要用我開始想到的那種思路來解得話,我豈不是要寫26個case語句來判斷嗎,汗。。。。不知道面試官要是看到這麼多代碼豈不是會當場走人。。。顯然這不是最好的解題辦法。

還是用泛型集合來解:

View Code

classprogram

{

staticvoidMain(string[]args)

{

//計算字符串中每種字符出現的次數(面試題)。

//“WelcometoChina,beijing”,

//不區分大小寫,打印“W2”“e2”“o3”……

/*思路:1將字符串都轉換爲小寫形式,否則大小寫會算各一個

*2以字符爲鍵每個字符出現的次數爲值建立Dictionary泛型集合

*3將字符串轉換爲字符數組

*4循環遍歷每個字符,加入集合中作爲鍵,其對應的值初始爲1

*5在加入鍵之前做一個判斷,由於集合中的鍵不能重複,所以判斷如果鍵中已經還有該字符

*則不再加入該鍵,只把他的值+1

*6去除字符串中的`空格tter()如果是字母,進行操作5

*7總結:主要是泛型集合的應用

*/

//例句:

//stringsentences="WelcometoChina,beijing";

eLine("請輸入一段字母");

stringsentences=Line();

//將字符串都轉換爲小寫形式

sentences=wer();

//建立泛型集合

Dictionarydict=newDictionary();

//將字符串變成字符數組

char[]chs=arArray();

//遍歷每一個字符

for(inti=0;i{

//通過char的方法判斷是否爲字母,如果爲字母,則進行下面的操作,

//否則不操作

if(tter(chs[i]))

{

//如果不包含該鍵,則加入集合中

if(!ainsKey(chs[i]))

{

//將每個字符加入集合中對應鍵,其值初始爲1

(chs[i],1);

}

else

{

//否則,包含該鍵,只將其對應的值+1即可值的類型爲int

//dict[chs[i]]=dict[chs[i]]+1;

dict[chs[i]]++;

}

}

}

//循環遍歷輸出集合中的鍵值

foreach(KeyValuepairkvindict)

{

eLine("字母:{0}出現了{1}次。",,e);

}

Key();

}

}

同樣,代碼很簡單:

這時,我又突發奇想想到了另一種情況:

用戶輸入一串字母和數字的混合字符串如“ddeieiei4954jjfjdji383ddjeuut3003k”

統計出每個數字或字母出現的次數,且數字在前,字母在後 ,數字和字母內沒有順序要求

如 數字 4 出現了 2次

數字 3 出現了 4次

.......

........

字母 d 出現了 5次

...........

當然,最簡單的還是用泛型集合來解了。。。。

最後來個總結吧:

個人認爲,遇到一個新的問題的時候,關鍵是思路,把思路一步一步理順了,就像我們老師說的那樣,知道你要幹什麼,想好怎樣去做,最後再去寫代碼。不要一上來就敲代碼,思路都沒搞清楚呢,最後肯定是問題多多。

希望這篇文章可以給像我這樣正在找工作的應屆生一些小小的幫助吧!

(突然覺得在大學裏學的那些知識都太簡單了,而且太深了也不講。找工作時真的很無奈啊!!!)