阿里巴巴后端预热题,秋招第一波笔试的悲惨遭遇。

作为一名软件工程的本科生,满怀热情的投了各大公司的简历。

今天早上兴致勃勃的做了阿里巴巴后端开发的第一道预热题。

 

经过一番挣扎,我觉着,题目出的不够严谨,并且测试用例也出现错误了。

题目描述如下。

 

幼儿园有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]!='';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 }

在网上目前也没查到任何关于这道题的信息,所以写下这篇博文。

如果有好朋友觉着我的思路有问题,希望能得到指点!

感恩戴德!

嘻嘻~~

原文地址:https://www.cnblogs.com/Lin-Yi/p/7349086.html