做为一名软件工程的本科生,满怀热情的投了各大公司的简历。ios
今天早上兴致勃勃的作了阿里巴巴后端开发的第一道预热题。后端
通过一番挣扎,我觉着,题目出的不够严谨,而且测试用例也出现错误了。测试
题目描述以下。spa
幼儿园有10个小朋友,把1 – 20中全部奇数数字的卡片分别发给这20个小朋友。
集合的时候小朋友们排成一排,组成一个由数字组成的字符串,如35971315….11917,
可是老师发现少了一个小朋友,你能帮忙找出少掉的那个小朋友吗?3d
输入:
数字组成的字符串
输出:
缺失的那个数字
输入范例:
359713159151191
输出范例:
3code
这道题限时40分钟,要求只能用C++来编写。开始拿到题10多分钟我就有了思路。blog
捋一下思虑:后端开发
幼儿园有10个小朋友!!10个!(题目中把卡片发给了20个小朋友??!!)ci
老师发给他们 1到20的奇数卡片!!注意是奇数!!也就是1 3 5 7...19,最大是19,最小是1。开发
而后集合他们站成一排,没有顺序。
按照个人理解,每一个人手里的数只能是以下:一、三、五、七、九、十一、1三、1五、1七、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 }
在网上目前也没查到任何关于这道题的信息,因此写下这篇博文。
若是有好朋友觉着个人思路有问题,但愿能获得指点!
感恩戴德!
嘻嘻~~