马上就要到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. String类中常用的方法(重要)

    1.字符串与字节 public String(byte[] byte); 将全部字节变成字符串 public String (byte[] byte,int offset,int length) 将部 ...

  2. [LeetCode] License Key Formatting 注册码格式化

    Now you are given a string S, which represents a software license key which we would like to format. ...

  3. jenkins构建个人github上的项目

    最近刚进一家新公司,公司采用的是自动化集成测试工具jenkins进行,构建,部署项目 因为以前,没接触过这类工具,所以打算在自己本机安装一个jenkins进行学习 具体安装步骤,很简单,不做讲解 1. ...

  4. C++traits——STL源码剖析

    有时候我们希望知道迭代器所指的元素类型. 以迭代器所指声明对象: template<typename Iterator, typename T> void func_impl(Iterat ...

  5. 10-8 uva1262密码

    题意:有两个图,每一列都存在的字母选作密码,就第k大的密码 思路: 找出各个位置上的密码, 假设: 第1个字母只能是{A,C,D,W}, 第2个字母只能是{B,O,P}, 第3个字母只能是{G,M,O ...

  6. bzoj4558[JLoi2016]方 容斥+count

    4558: [JLoi2016]方 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 452  Solved: 205[Submit][Status][D ...

  7. 软件测试人员在工作中如何运用Linux

    从事过软件测试的小伙们就会明白会使用Linux是多么重要的一件事,工作时需要用到,面试时会被问到,简历中需要写到. 对于软件测试人员来说,不需要你多么熟练使用Linux所有命令,也不需要你对Linux ...

  8. VC++ 6.0中添加库文件和头文件

    附加头文件包含 VC6.0中: VC6.0默认include包含路径:Tools>Options>Directories>Include files. 对于特定项目的头文件包含,在& ...

  9. javap -c命令详解

    https://www.cnblogs.com/beautiful-code/p/6424977.html

  10. swift之属性

    知识点总结: 1.存储属性 struct Town{ let region = "South" //只读属性 var population = //读写属性 } 2.惰性存储属性 ...