作为一名软件工程的本科生,满怀热情的投了各大公司的简历。
今天早上兴致勃勃的做了阿里巴巴后端开发的第一道预热题。
经过一番挣扎,我觉着,题目出的不够严谨,并且测试用例也出现错误了。
题目描述如下。
幼儿园有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]!='