• 欢迎交朋友,QQ:2693438633
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏我的博客吧

华为机试

CS 平凡 244次浏览 1个评论
三道题, 难度不是很大,但是有一些坑还是要注意。
最大的坑在于OJ系统只告诉你通过了xx%,却不告诉你哪一个测试用例没有通过。这对于只刷leetcode的我来说很痛苦,要自己去想测试用例。

第一题:

给一个字符串,找到最长数字串的长度,并输出这个数字串。
例:afdfa245613fad1213中最长数字串为245613.
这道题非常简单,代码如下:

 

但是通过率只有75%,后来怎么想都没想出哪里出错了。。无奈先放弃了这道题,把另外两道题做出来了。
后来牛客网发了个公告,这道题出错了。如果输入字符串为空,只输出0就行了。。
尼玛,出题能认真点吗,害的我想了半天到底哪里错了。
后来把最后的逻辑改为:
pass了。

第二道:

一个数列从1到100,代表100个人,且围成一个圈。
输入一个数n,从第一个开始报数,如果报到该数,那么就自动出列,接着从下一个开始报数。
要找到最后幸存的数并输出
例如输入3,那么一开始3的倍数全部出列了。从100开始,再到1、2、4…….继续报数,最后只剩下了58和91.
这道题还是很有意思的。
我的想法是,把问题分解,只考虑一圈的情况,在这一圈中,哪些数出列了?最终剩下的又是哪些?
所以,我把一圈的情况封装成了一个函数aCircle(),代码如下:

 

在aCircle这个函数中,输入是起始数列,输出是下一个起始数列,也就是排好序的数列。 startArr代表下一个起始数列前面的几个数,例如,如果输入n=6,从1到100开始报数,如果报到96,那么后面就不会有人再被出列了。所以下一轮开始的数便是97,所以,下一个数列便是 97、98、99、100、1、2、3、4……

这就是这道题的核心所在,只要循环运行这个函数,就不断有人出列,最终得到幸存者。循环的终止条件是判断长度。
我觉得代码没什么问题了,于是提交了。但是通过率是70%多,后来我把题目要求仔细阅读了一下,发现题目中提到,对于输入小于2和大于99的都要输出ERROR。。
唉,太粗心了,一开始没注意到这个。
最终代码:

 

第三题,接酒。

有n个酒龙头,出酒速度为1,有m个客人,他们的接酒量分别是mi。
每接完一个,下一个人马上接酒,无缝对接。
求完成所有接酒的时间。
例如有3个酒龙头,有5个客人,接酒量分别为4 4 1 2 1
那么最终的接酒时间为4,因为第三个酒龙头处理完后面三个人时,前面两个人同时接完。
如果5个客人的接酒量为4 4 1 3 1,接酒时间就是5
这道题难度算是中等吧。 不过对于我这种经常刷leetcode的人来说,还是小菜。
我也没想别的,直接写代码完全模拟这个过程就行了:

 

总结一下,这三道题目难度还是不大的,但是不得不吐槽的是牛客网的判定系统强行把他们拉到了高级。。。
只跟你说你做错了,却不告诉你哪里错,这才是最恶心的。
而且第一道题目本身就有问题,让人怎么玩啊。
我对着第一题调试了半个小时,最后收到公告说这道题有问题。不知道有多少人跟我一样受罪。
还好最后全部通过了,最后奶一发python大法好,刷题跟切菜一样简单。代码写的比较匆忙,也没来得及重构。

转载请注明华为机试
喜欢 (5)
[平凡]
分享 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
(1)个小伙伴在吐槽
  1. 我明天把这几个题目也做一下
    karaysn2017-11-14 22:04 回复