马上就要到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为止,因为至少得容纳两个数才算序列。

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

#include <iostream>
using namespace std; void printResult(int start,int end)
{
cout<<"[";
for(int i=start;i<=end;i++)
cout<<i<<",";
cout<<"]"<<endl;
} void findSumIsN(int n)
{
int start=1,end=2;
int sum=start+end;;
while(start<(n+1)/2)
{ if(sum==n)
{
printResult(start,end);
}
while(sum<n)
{
end++;
sum+=end;
if(sum==n)
{
printResult(start,end); }
}
sum-=start;
start++; }
} int main(int argc, char** argv) { findSumIsN(15);
return 0;
}

整个代码基本上就是上述思路转化为程序语言之后的结果,代码很简单,所以也没加啥注释,虽然很简单,但是却能够考察一个程序员能否将自己的思考过程用程序化的语言表达出来,这也是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. Java 枚举类型简介

    目录 Java 枚举示例 Java 枚举构造函数 枚举类型是用于定义常量集合的特殊类型,更确切的说,JAVA枚举类型是一种特殊的 java 类.枚举类型可以包含常量.方法等.在 java5 中添加了 ...

  2. VINS 估计器之检查视差

    为什么检查视差 VINS里为了控制优化计算量,在实时情况下,只对当前帧之前某一部分帧进行优化,而不是全部历史帧.局部优化帧的数量就是窗口大小.为了维持窗口大小,需要去除旧的帧添加新的帧,也就是边缘化 ...

  3. opencv2.4.9卸载安装

    1.安装opencv2.4.9过程中遇到的问题. 1.使用 sudo apt-get install libopencv-dev 安装OpenCV 2.4.9 发现版本为2.4.8,故卸载重装. 查看 ...

  4. XML 解析默认去掉命名空间和注释

    //创建xml文档 XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(@"C:\Users\Tony\Downloads\统一标准报文格 ...

  5. no zuo no die

    #include <iostream> #include <cstring> #include <cstdio> using namespace std; name ...

  6. 2015 多校联赛 ——HDU5402(模拟)

    For each test case, in the first line, you should print the maximum sum. In the next line you should ...

  7. hdu 5538(水)

    Input The first line contains an integer T indicating the total number of test cases. First line of ...

  8. [bzoj4883][Lydsy2017年5月月赛]棋盘上的守卫

    来自FallDream的博客,未经允许,请勿转载, 谢谢. 在一个n*m的棋盘上要放置若干个守卫.对于n行来说,每行必须恰好放置一个横向守卫:同理对于m列来说,每列 必须恰好放置一个纵向守卫.每个位置 ...

  9. [bzoj4815]: [Cqoi2017]小Q的表格

    来自FallDream的博客,未经允许,请勿转载,谢谢. 小Q是个程序员. 作为一个年轻的程序员,小Q总是被老C欺负,老C经常把一些麻烦的任务交给小Q来处理.每当小Q不知道如何解决时,就只好向你求助. ...

  10. java continue与break区别

    在循环体中跳出循环语句有continue与break语句 continue:跳出本次循环,包括本次循环continue后面的语句, break:跳出循环体,就是说一遇到break循环就结束. 代码: ...