面试题
n个数中,n-1个重复偶数次,1个出现奇数次,怎么找出出现奇数次的那个数
这个问题是一个同事面试时问到的题目,我觉得很有趣,就拿来自己用了,题目的答案在最下面。
在看这个问题前,先聊聊一个前端面试一个问题
前端面试是否考察算法
大概2年前,我在微博上面看到两位大牛的争论:
@pureFE对@真阿当 说:阿当哥你好:我是一名在校学生,文科专业。前一段找实习的过程中注意到一些公司有算法要求。对于前端来说,专业知识的补习路线应该如何安排,应该像计算机专业那样从C、数据结构等等开始吗?对于前端开发者来说,专业知识应该达到何种程度才是合格?不知您能否指点一二,感激不尽!
@真阿当: 前端在实战中对算法和数据结构几乎没有要求,在你当下的境况学习这些知识对你找工作一点帮助也没有。前端开发的门槛低,所以有很多非科班出身的人从这个领域进入IT圈,你无需为“非科班出身”背上压力。为找工作的话,建议最快的路线是:先学css、后学一些基础js书……
@寒冬winter:100%反对。
回复@真阿当: 阿当你经常说前端工程师应该团结起来加强影响力,你就是这么让大家加强的么?没有算法能力,前端工程师怎么去实现新的交互效果?没有数据结构知识,前端工程师怎么处理大数据?没有这样的能力,前端怎么去承担更重要的职责?
@真阿当:算了,不争了,我该表达的都表达完了。求同存异。我的言论也只代表我个人看法,不保证一定是对的,各人有各人自己认同的发展路线。更倾向于哪种观点,决策权在诸位自己手上,冷暖自知谁也替不了你。不要动不动就“误人子弟”帽子扣下来,我担不起,也不想担。一家之言,说的是自己的真实感想。到此为止
@真阿当回复@糕富帅是我的人生理想:恩,是的,我说过要想前端能走得远一些,至少用原生js锻炼半年以上。我说的是“如何成为一个高级工程师”,而不是“如何跨入门槛”。绝大多数公司在面试时只会看这个人“在这个领域的基本功”怎么样,过不了这一关,跨不过入行的门槛。所以要先学会怎么通过面试。
@寒冬winter:目前为止我好像没听说哪个前端因为学习计算机基础知识耽误了专业技能,从当年51js我认识的人来看,基础好的无一例外几年后立于行业顶点,而那些”顺应市场”的人,不知去了哪里。实际上,这只关乎人的素质,舍弃了基础节约的时间并不能用于其它知识或者英语。
我这边的答案也是需要的,直接举一些例子:
最近很火的框架reactjs,他的核心就是实现了一个虚拟dom,每次页面的更新都能通过虚拟dom计算出最小变更内容,从而达到页面高效的刷新,实现最小diff的算法很关键
腾讯在手机web上实现了利用localstorage存储js,然后js实现增量更新的算法,达到每次刷新仅仅请求变更了的js内容,这样就解决了手机端流量宝贵和网速慢的问题,实现增量更新的算法很关键
我刚来百度时,组内有一位echart的贡献者,在一次组内分享中,一个大数据量储存的优化的问题,大概是下面这样的数
[100001, 100002, 100003 …]
在通过canvas绘图时,会比较费内存,然后他就使用时间换空间的方式处理如下
[1, 2, 3 …] 设定base 是100000
这样就解决了一定数据量内存过大的问题。
我觉得上面的例子就足够支撑算法在前端的重要性了,因为现在的前端不在仅仅是还原一些UI设计,做做交互了,实现一些功能了。
现在的前端越来越复杂,涉及面越来越多,向后延生可以利用nodejs去做服务端(全栈工程师);平行延生可以用react native去做native的开发;纵向延生,也会考虑webapp内存泄露,性能调优,打包编译,线上部署等等。
这些东西研究的越深,对于计算机基础知识的要求就越高,当然其中就包含了算法基础了。
那么问题来了,如果我们对于算法没有研究怎么办,其实我开始就是对算法没有什么研究,也不知道怎么运用在工作中,只是后来的工作中,慢慢发现自己对于计算机一些基础的匮乏,根据需要一点点补充的。
我一次在前端接触简单的算法是在看一个桌球游戏的源码时,游戏里面球的碰撞,反弹,加速度等,都是一些简单的计算和物理知识,挺有趣的
游戏github地址,我加了一些注释
https://github.com/tangguangyao/Snooker
回到面试题,我们可以聊聊这个题目为什么我觉得挺不错的
- 如果没有算法基础的人,如果思维不错,至少能够在一定时间内给出一个比较笨的解决方案,然后给与一些提示,能够引导到我期望的答案
- 对于有算法基础的人,能够大概说出几种解决方案,在我们余下的沟通中,回答一个我期望的答案,甚至更好的答案
微信公众号
答案
使用!(取非)的方式,出现第一次记录1,第二次回到0,第三次记录1…这样循环一次所有数,最后记录为1的就是我们需要的那个奇数