作為一名軟件工程的本科生,滿懷熱情的投了各大公司的簡歷。
今天早上興致勃勃的做了阿里巴巴后端開發的第一道預熱題。
經過一番掙扎,我覺着,題目出的不夠嚴謹,並且測試用例也出現錯誤了。
題目描述如下。
幼兒園有10個小朋友,把1 – 20中所有奇數數字的卡片分別發給這20個小朋友。
集合的時候小朋友們排成一排,組成一個由數字組成的字符串,如35971315….11917,
但是老師發現少了一個小朋友,你能幫忙找出少掉的那個小朋友嗎?
輸入:
數字組成的字符串
輸出:
缺失的那個數字
輸入范例:
359713159151191
輸出范例:
3
這道題限時40分鍾,要求只能用C++來編寫。開始拿到題10多分鍾我就有了思路。
捋一下思慮:
幼兒園有10個小朋友!!10個!(題目中把卡片發給了20個小朋友??!!)
老師發給他們 1到20的奇數卡片!!注意是奇數!!也就是1 3 5 7...19,最大是19,最小是1。
然后集合他們站成一排,沒有順序。
按照我的理解,每個人手里的數只能是如下:1、3、5、7、9、11、13、15、17、19 之中的數。
我們要找到少的小朋友,換句話說,也就是字符串中沒出現以上數當中的哪一個??
因為把所有數字排成字符串了,我把1到19所有的數都列出來排成字符串,發現一共是15位數字。135791113151719 不論順序怎么樣一共是15位。
如果少一個數字,則如果少一個一位數,應該出現14位測試用例,如果少一個兩位數,則應出現13位的測試用例。(但是阿里在線評測的測試用例給的是15位??!!!??少小朋友嗎??)
再提一個我的疑問:如果1到19的所有奇數都出現,按照我的理解,最多只能出現兩次9,一個9 另一個19 應該沒有其他情況了吧?? 但是測試用例了出現了三次9???!!!
我都蒙了,怎么排都排不開了!
更奇怪的是,當我忽略這些,按照我的思路去解答這道題的時候,我的答案竟然和測試用例的答案相同!!不知道為啥。。
我給出我解答的思路:
小朋友的數字是1到19的奇數,那如果小朋友手里是兩位數,則一定是十幾,也就是輸入的字符中如果出現1,要么是十幾,要么是1.
如果出現的數字不是1,那就一定是個位數。
我的思想是:
先計算1到19所有奇數的加和存給sum。經過計算sum是100.
然后遍歷整個輸入的字符串:
如果出現1,我就把sum減小10,按照碰到十幾來計算
如果出現不是1,我就把sum減小出現那個數。
經過這樣一個遍歷,有可能本年來出現1的數字,我把它當成10了,所以我又對sum進行判斷,如果sum小於等於0,就讓它增10 再減1.
但是不論如何,給出我的代碼,不知道我的思路是否正確,希望能帶給大家一些思路。
我的代碼是這樣的:C++實現
1 #include "iostream"
2 using namespace std; 3 int main(){ 4 char li[50]; 5 cin>>li; 6 int sum = 0; 7 for(int i = 1;i<=19;i+=2){ 8 sum+=i; 9 } 10 for( int i = 0;li[i]!='\0';i++ ){ 11 if(li[i]=='1'){ 12 sum -= 10; 13 } 14 if(li[i]>='2'){ 15 int a = li[i]-'0'; 16 sum -= a; 17 } 18 } 19 while( sum <= 0 ){ 20 sum+=9; 21 } 22 cout<<sum; 23
24
25 return 0; 26 }
在網上目前也沒查到任何關於這道題的信息,所以寫下這篇博文。
如果有好朋友覺着我的思路有問題,希望能得到指點!
感恩戴德!
嘻嘻~~