【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 ...
随机推荐
- 【linux之压缩归档,tar】
一.压缩和归档 压缩算法就是等量代换 gzip FILE1 FILE2... 扩展名 .gz -#(数字):#代表压缩等级,1-9,默认6 -d(compression):解压缩 -r:递归的压缩目录 ...
- org.apache.commons.lang3.tuple.Pair 作为更新参数,XML 中的 Sql 取不到值、报错
项目用的 Mybatis,今天改一个需求,落地实现是批量更新,且只需要根据主键(id)来更新一个字段(name). 于是,没有犹豫,像下面这样设计了数据结构: 既然是批量更新,那外层肯定是 List ...
- java String的各种方法及操作
No. 方法名称 功能 字符与字符串 01 public String(char[] value) 将字符数组中所有内容变为字符串 02 public String(char[] value,int ...
- js在光标处插入内容
//场景一 简易的页面可以这样写var range = window.getSelection().getRangeAt(0);range.insertNode(document.createText ...
- html checkbox样式美化
思路:使用label结合checkbox,背景图片进行美化. 原理: 1. for 属性规定 label 与哪个表单元素绑定,显式绑定和隐式绑定,均可实现checkbox的选用与取消效果,具体见:&l ...
- 【NOIP模拟赛】总结
题目描述 输入 第一行是5个正整数,n,m,k,S,T,分别代表无向图点数,边数,蝙蝠的数量,二小姐所在起点的编号,目标点的编号. 第二行是k个正整数,分别代表大小姐每个蝙蝠所在的起点的编号.接下来有 ...
- 【UVA–11997 K Smallest Sums 】
·哦,这题要用优先队列?那大米饼就扔一个手写堆上去吧! ·英文题,述大意: 输入n个长度为n的序列(题中是k,2<=k<=750).一种结果定义为:从每个序列中都要挑选一个数加 ...
- Sql Server 镜像相关
http://blog.csdn.net/dba_huangzj/article/details/35995083
- Spring学习笔记1——入门
Spring是一个基于IOC和AOP的结构J2EE系统的框架 IOC 反转控制 是Spring的基础,Inversion Of Control 简单说就是创建对象由以前的程序员自己new 构造方法来调 ...
- 数据结构之B树、B+树(一)
B-树 什么是B-树? B树是一种查找树,我们知道,这一类树(比如二叉搜索树,红黑树等等)最初生成的目的都是为了解决某种系统中,查找效率低的问题.B树也是如此,它最初启发于二叉搜索树,二叉搜索树的特点 ...