阿里巴巴后端預熱題,秋招第一波筆試的悲慘遭遇。


作為一名軟件工程的本科生,滿懷熱情的投了各大公司的簡歷。

今天早上興致勃勃的做了阿里巴巴后端開發的第一道預熱題。

 

經過一番掙扎,我覺着,題目出的不夠嚴謹,並且測試用例也出現錯誤了。

 

題目描述如下。

 

 

 

幼兒園有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 }

 

在網上目前也沒查到任何關於這道題的信息,所以寫下這篇博文。

如果有好朋友覺着我的思路有問題,希望能得到指點!

感恩戴德!

嘻嘻~~

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM