【BAT经典算法面试题系列】求和为n的连续正整数
马上就要到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的连续正整数的更多相关文章
- python经典算法面试题1.5:如何找出单链表中的倒数第K个元素
本题目摘自<Python程序员面试算法宝典>,我会每天做一道这本书上的题目,并分享出来,统一放在我博客内,收集在一个分类中. [微软笔试题] 难度系数:⭐⭐⭐ 考察频率:⭐⭐⭐⭐⭐ 题目描 ...
- 算法面试题:一个List<Student>,要求删除里面的男生,不用Linq和Lamda,求各种解,并说明优缺点!
算法面试题:一个List,要求删除里面的男生,不用Linq和Lamda,求各种解,并说明优缺点! 解题思路 这是群里某位小伙伴去面试碰到的面试题,从题目本身来看,面试官应该是要考察面试者对泛型 Lis ...
- LeetCode 算法面试题汇总
LeetCode 算法面试题汇总 算法面试题 https://leetcode-cn.com/problemset/algorithms/ https://leetcode-cn.com/proble ...
- Java算法面试题(史上最强、持续更新、吐血推荐)
文章很长,建议收藏起来,慢慢读! 疯狂创客圈为小伙伴奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : <Netty Zookeeper Redis 高并发实战> 面试必备 + 大厂必备 ...
- Twitter算法面试题详解(Java实现)
最近在网上看到一道Twitter的算法面试题,网上已经有人给出了答案,不过可能有些人没太看明白(我也未验证是否正确),现在给出一个比较好理解的答案.先看一下题目. 图1 先看看图图1.可以将方块看做砖 ...
- 算法实践——Twitter算法面试题(积水问题)的线性时间解法
问题描述:在下图里我们有不同高度的挡板.这个图片由一个整数数组所代表,数组中每个数是墙的高度.下图可以表示为数组(2.5.1.2.3.4.7.2).假如开始下雨了,那么挡板之间的水坑能够装多少水(水足 ...
- 华为Python 算法面试题
华为算法面试题 """ 算法题: 提供一个序列,完成对这个序列的分割.要求分割后的两个序列彼此差值最小 实现函数,返回两个序列 """ de ...
- 常见的js算法面试题收集,es6实现
1.js 统计一个字符串出现频率最高的字母/数字 let str = 'asdfghjklaqwertyuiopiaia'; const strChar = str => { let strin ...
- 【转】Twitter算法面试题详解(Java实现)
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://androidguy.blog.51cto.com/974126/1319659 ...
随机推荐
- thinphp验证码的简单实现
index.html <!DOCTYPE html><html lang="en"><head> <meta charset=" ...
- [LeetCode] Add Bold Tag in String 字符串中增添加粗标签
Given a string s and a list of strings dict, you need to add a closed pair of bold tag <b> and ...
- servlet与ajax数据交换(json格式)
JSON数据格式: JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式. 易于人阅读和编写.同时也易于机器解析和生成. 它基于的一个子集. JSON采用完全独 ...
- Windows 2012服务器安装GPU版TensorFlow完全攻略
一.首先,推荐用Anaconda安装 因为Anaconda本身就已经默认安装了很多常用的Python库,可以省去大量的库安装过程,并且解决兼容性问题. Anaconda本身的安装也非常简单,搜索Ana ...
- P2520 [HAOI2011]向量
题目描述 给你一对数a,b,你可以任意使用(a,b), (a,-b), (-a,b), (-a,-b), (b,a), (b,-a), (-b,a), (-b,-a)这些向量,问你能不能拼出另一个向量 ...
- [Codeforces 864E]Fire
Description Polycarp is in really serious trouble — his house is on fire! It's time to save the most ...
- [ZJOI2010]数字计数
题目描述 给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次. 输入输出格式 输入格式: 输入文件中仅包含一行两个整数a.b,含义如上所述. 输出格式: 输出文件 ...
- [BeiJing2011]元素
Description 相传,在远古时期,位于西方大陆的 Magic Land 上,人们已经掌握了用魔 法矿石炼制法杖的技术.那时人们就认识到,一个法杖的法力取决于使用的矿石. 一般地,矿石越多则法力 ...
- 【BZOJ2733】【HNOI2012】永无乡
原题传送门 题意:给你N个带权点,一开始相互独立(每个点视为单独一个集合),有2种操作:1)合并2个集合:2)查询包含某元素集合内的权值第k小点编号. 解题思路:显然合并就是并查集,而查询则是平衡树实 ...
- 最小公共祖先 (Tarjan) POJ1470
POJ 1470 标准的LCA,输入感觉怪怪的=.= 自己看了下Tarjan,再参考了下别人的处理方法(感觉自己好弱..) #include <iostream> #include < ...