马上就要到9月份了,意味着一年一度的秋招就要开始了,相信不论是正在实习的童鞋还是马上就要找工作的童鞋,BAT无疑是国内的“明星企业”,是每个学计算机的小伙伴们心之向往的企业,但是呢?对于进BAT来讲,即使你项目经验非常丰富,想进BAT,还有一道门槛要过那就是算法面试,尤其是想去百度的小伙伴们,那算法必须得考,也是面试中的重点。

说实话,对于算法这个东西,真的得靠天赋的,不是像项目那样,你多做多动手自然就会,虽然要靠天赋,但是对于基本的算法以及基本的算法面试题我们还是可以通过多积累多思考来培养自己的解题思路。本博客就是通过讲解BAT算法面试中的一些具备代表性的题来教大家如何去慢慢的积累算法方面的解题思路。

题目描述:给一个正整数n,打印出所有的和为n的连续正整数序列,如果不存在则输出空,如:n=15,因为15=1+2+3+4+5=4+5+6=7+8则输出[1,2,3,4,5],[4,5,6],[7,8]

其实对于算法基础比较好的童鞋来说这道题不算难,但是在面试那种环境下,小伙伴们可能因为紧张或者其他原因,在面试现场规定的时间内写出正确的程序也不是一件很简单的事,因此我们不妨从一些简单的例子入手,一点一点的分析,这样可能解题思路就打开了。

对于本题,如果在面试时一时想不出来,可以先考虑一种自己平时遇到的简单的但和此题情况相类似的题目思考一下,如在一个给定的递增的数组中选取两个数使得其和等于n,存在则输出这两个数,不存在则输出空。对于这道题则太简单了,我们都知道可以定义两个指针start与end,刚开始时start指向数组中的最小的元素(即第一个元素),end指向数组中的最大元素(即最后一个元素),然后判断start+end的和sum是否为n,如果是则输出start与end的值,如果sum>n则说明我们应该丢去sum中较大的值end,而选一个比end小的值,即array[end--],反之如果sum<n则说明我们应该丢去sum中较小的值start,而选一个比start大的值,即array[start++],直至start>=end为止,如果start>=end还没找到则说明满足这种情况的例子不存在,输出空,注意,可能存在多个满足条件的例子,找到一个后然start+1或者end-1,然后继续找下一个满足条件的例子,直至start>=end为止。

参考上面的例子的思路,因为是找连续的正整数序列,因此我们可以这样先定义一个start=1,end=2,然后类似滑动窗口的概念,我们通过让增加start与end的值来动态的调整这个滑动窗口的范围,直至这个滑动窗口中容纳的正整数序列的和为n,具体来说就是当滑动窗口中的和sum<n时则说明,我们应该让这个滑动窗口容纳更多的值,所以应该让end+1,如果sum>n,则说明我们应该缩小这个滑动窗口容纳的值,所以应该让start+1,直至start<=n/2为止,因为至少得容纳两个数才算序列。

基于上述思路,我们可以写出如下的代码:

  1. #include <iostream>
  2. using namespace std;
  3.  
  4. void printResult(int start,int end)
  5. {
  6. cout<<"[";
  7. for(int i=start;i<=end;i++)
  8. cout<<i<<",";
  9. cout<<"]"<<endl;
  10. }
  11.  
  12. void findSumIsN(int n)
  13. {
  14. int start=1,end=2;
  15. int sum=start+end;;
  16. while(start<(n+1)/2)
  17. {
  18.  
  19. if(sum==n)
  20. {
  21. printResult(start,end);
  22. }
  23. while(sum<n)
  24. {
  25. end++;
  26. sum+=end;
  27. if(sum==n)
  28. {
  29. printResult(start,end);
  30.  
  31. }
  32. }
  33. sum-=start;
  34. start++;
  35.  
  36. }
  37. }
  38.  
  39. int main(int argc, char** argv) {
  40.  
  41. findSumIsN(15);
  42. return 0;
  43. }

整个代码基本上就是上述思路转化为程序语言之后的结果,代码很简单,所以也没加啥注释,虽然很简单,但是却能够考察一个程序员能否将自己的思考过程用程序化的语言表达出来,这也是BAT重视算法面试的原因所在。

程序输出结果如下:

另外大家如果要训练算法的话,给大家推荐一个网站leetcode,很不错的,大家百度就可以搜到,另外如果大家刷leetcode上的题不是很懂,可以follow我的github账号,本人在网上找到了一份很不错的leetcode的解题报告,基本上AC过140道题,如果大家follow我的github账号,本人后期将上传该解题报告到github上供大家交流学习。我的github:https://github.com/HuTianQi,欢迎follow,star。

【BAT经典算法面试题系列】求和为n的连续正整数的更多相关文章

  1. python经典算法面试题1.5:如何找出单链表中的倒数第K个元素

    本题目摘自<Python程序员面试算法宝典>,我会每天做一道这本书上的题目,并分享出来,统一放在我博客内,收集在一个分类中. [微软笔试题] 难度系数:⭐⭐⭐ 考察频率:⭐⭐⭐⭐⭐ 题目描 ...

  2. 算法面试题:一个List<Student>,要求删除里面的男生,不用Linq和Lamda,求各种解,并说明优缺点!

    算法面试题:一个List,要求删除里面的男生,不用Linq和Lamda,求各种解,并说明优缺点! 解题思路 这是群里某位小伙伴去面试碰到的面试题,从题目本身来看,面试官应该是要考察面试者对泛型 Lis ...

  3. LeetCode 算法面试题汇总

    LeetCode 算法面试题汇总 算法面试题 https://leetcode-cn.com/problemset/algorithms/ https://leetcode-cn.com/proble ...

  4. Java算法面试题(史上最强、持续更新、吐血推荐)

    文章很长,建议收藏起来,慢慢读! 疯狂创客圈为小伙伴奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : <Netty Zookeeper Redis 高并发实战> 面试必备 + 大厂必备 ...

  5. Twitter算法面试题详解(Java实现)

    最近在网上看到一道Twitter的算法面试题,网上已经有人给出了答案,不过可能有些人没太看明白(我也未验证是否正确),现在给出一个比较好理解的答案.先看一下题目. 图1 先看看图图1.可以将方块看做砖 ...

  6. 算法实践——Twitter算法面试题(积水问题)的线性时间解法

    问题描述:在下图里我们有不同高度的挡板.这个图片由一个整数数组所代表,数组中每个数是墙的高度.下图可以表示为数组(2.5.1.2.3.4.7.2).假如开始下雨了,那么挡板之间的水坑能够装多少水(水足 ...

  7. 华为Python 算法面试题

    华为算法面试题 """ 算法题: 提供一个序列,完成对这个序列的分割.要求分割后的两个序列彼此差值最小 实现函数,返回两个序列 """ de ...

  8. 常见的js算法面试题收集,es6实现

    1.js 统计一个字符串出现频率最高的字母/数字 let str = 'asdfghjklaqwertyuiopiaia'; const strChar = str => { let strin ...

  9. 【转】Twitter算法面试题详解(Java实现)

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://androidguy.blog.51cto.com/974126/1319659 ...

随机推荐

  1. 开发一个成功APP的六个技巧

    越来越多的人开始使用智能手机,平板电脑或其他的移动设备.出于这个原因,移动APP开发已成为当今软件开发中增长最快的领域之一.本文提供九个简单而有效的提示,可帮助您规划和实施成功的移动APP. 1.目标 ...

  2. [LeetCode] String Compression 字符串压缩

    Given an array of characters, compress it in-place. The length after compression must always be smal ...

  3. electron通讯

    Electron桌面应用实现两个窗口(渲染进程)之间的通讯,传输数据: 方法1:在两个网页(渲染进程)间共享数据最简单的方法是使用浏览器中已经实现的 HTML5 API. 其中比较好的方案是用 Sto ...

  4. tarjan——cogs 1298 通讯问题

    1298. 通讯问题 ★   输入文件:jdltt.in   输出文件:jdltt.out   简单对比 时间限制:1 s   内存限制:128 MB [题目描述] 一个篮球队有n个篮球队员,每个队员 ...

  5. 【转载自netfocus博客】聚合(根)、实体、值对象精炼思考总结

    1.内容摘要 最近在看DDD领域驱动设计,看到实体(Entity),值对象 (Value Object),以及聚合根(Aggregate Root) 时.对他们的关系有些模糊,不清楚.于是去找了找资料 ...

  6. [POI 2006]OKR-Periods of Words

    Description 题库链接 定义 \(A\) 串为 \(B\) 串的循环串,当且仅当 \(A\) 是 \(B\) 的前缀(不包括 \(B\) 本身),且 \(B\) 为连续的 \(A\) 串拼接 ...

  7. [POI2016]Nim z utrudnieniem

    Description A和B两个人玩游戏,一共有m颗石子,A把它们分成了n堆,每堆石子数分别为a[1],a[2],...,a[n],每轮可以选择一堆石子,取掉任意颗石子,但不能不取.谁先不能操作,谁 ...

  8. [SDOI2010]代码拍卖会

    题目描述 随着iPig在P++语言上的造诣日益提升,他形成了自己一套完整的代码库.猪王国想参加POI的童鞋们都争先恐后问iPig索要代码库.iPig不想把代码库给所有想要的小猪,只想给其中的一部分既关 ...

  9. bzoj 5286: [Hnoi2018]转盘

    Description Solution 首先注意到一个点不会走两次,只会有停下来等待的情况,把序列倍长 那么如果枚举一个起点\(i\),答案就是 \(min(max(T[j]+n-(j-i)-1)) ...

  10. UVA11795 Mega Man's Mission

    状压dp #include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring> ...