2017 携程 笔试编程题 1

    • 前言
    • 正文
      • 题目要求
      • 思路
        • n10
        • n 18
      • 核心
      • 测试
    • 总结

前言

今天参加了携程的笔试,编程题第一题一开始想错了方向,花费了很多时间(虽然第二题就是给时间也不一定做得出来,(⊙﹏⊙)b)。

下面记录一下这个小插曲。

正文

题目要求

将指定的正整数n分解成若干个互不相同的自然数的和,且使这些自然数的乘积最大

人家给了个输入输出的例子,如下:

输入15
输出 144

言下之意就是在自然数之和为15的这些数字中,乘积最大的一对是

2 3 4 6

思路

为了使得这些自然数之和的乘积最大,那么这些数字应该尽可能的接近。

下面举几个小例子:

n=10

2+3+4 = 9
// 剩下的那个1补到4上面
2+3+5 

这个时候最大的乘积变成了30

n = 18

2+3+4+5 = 14
//按照刚才的思路, 剩下的4 添加到5上面
2+3+4+9

此时最大的乘积结果为216

那么这时的结果是最大的吗?

答案是否定的,因为刚才是从下标为2开始的。如果下标从3,从4开始呢,我们来看下效果。

3+4+5+6 -->> 最大结果为:360
4+5+6+7>18则进行去尾加和
4+5+9  -->> 最大结果为: 180

剩下的其实就不用考虑了。

核心

经过刚才的铺垫,这下不难理解了。最笨的方法就是不断的递增下标,然后记录每一个下标对应的最大值。存储起来,然后找到这些最大值中最大的那个,就是我们要求的结果了。

代码如下:

def mutl(ls):
    result = 1
    for item in ls:
        result *= item
    return result

def compute(n, step):
    path = []
    cursum = 0
    for index in range(step, n):
        if cursum > n:
            last = path.pop()
            path.append(path.pop() + n - (cursum - last))
            break
        path.append(index)
        cursum += index
    return mutl(path)

def my(n):
    total = []
    maxvalue = 0
    for step in range(int(n/2)):
        item = compute(n, step)
        total.append(item)
    maxvalue = max(total)
    return maxvalue

n = 15
result= my(n)
print(result)

运行结果:

144

测试

再来多测几组数据。

  • n=10
30
  • n=18
360

这下,可以啦。需要注意的是:

递增下标到n的一半的位置就可以了,否则结果会不正确,这是因为计算每次的step的时候会把第一个给算进去,所以导致结果偏大。

总结

就携程的笔试题而言,前面部分的问答题和选择题还算是中规中矩,比较偏重于理论和实践。

编程题就真的是考验算法的了。大部分的笔试题都是动态规划类型的。我本人比较偏重于开发方向,所以参加这种笔试题真的是有点力不从心。

不管怎么说,算法是很有必要的。多学点,肯定没错,说不一定以后就用得到了。

我, 还有很长的路要走啊。

时间: 2024-11-08 21:42:41

2017 携程 笔试编程题 1的相关文章

银行数据库笔试编程题

一.写一个算法对1,8,5,2,4,9,7进行顺序排列并给出所使用方法. 我所用的方法: int[] a={1,8,5,2,4,9,7};   for(int i=0;i<a.length;i++){    for(int j=i+1;j<a.length;j++){     if(a[i]>a[j]){      //通过交换位置进行排序      int k=a[i];      a[i]=a[j];      a[j]=k;     }    }    System.out.pri

京东2015在线笔试----编程题--分苹果

其实挺坑爹的一个题目: 也不知道考察的重点是啥,大体思路是从2个人分开始算起,自己找到规律了,写代码实现. 讨论帖: http://bbs.csdn.net/topics/391835433?page=1#post-400493630 实现代码一: #include <stdio.h> #include <math.h> size_t apple(size_t b) { return b>0?pow(b,b)-(b-1):0; } int main() { printf(&q

京东2017校园招聘笔试真题(希尔排序)

对关键字{10,20,8,25,35,6,18,30,5,15,28}序列进行希尔排序,取增量d =5时,排序结果为( ) A. {6,18,8,5,15,10,20,30,25,35,28} B. {10,18,8,5,15,6,20,30,25,35,28} C. {10,20,8,5,15,6,18,30,25,35,28} D. {10,20,30,5,8,6,15,18,25,28,35} 希尔排序 希尔排序(Shell Sort)是插入排序的一种.也称缩小增量排序,是直接插入排序算法

后台开发-携程机票预订后台java开发编程具体代码?麻烦会的给发一下!谢谢!!!

问题描述 携程机票预订后台java开发编程具体代码?麻烦会的给发一下!谢谢!!! 携程机票预订后台java开发编程具体代码?麻烦会的给发一下!谢谢!!! 解决方案 这里怎么可能有,你想想呢 解决方案二: 这种东西怎么可能发上来啊,都是机密

携程宣布发行1.6亿美元可转债 2017年到期

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 北京时间9月19日晚间消息,携程(Nasdaq:CTRP)今天宣布了总额1.6亿美元.将于2017年到期的高级可转债的发行价格. 携程将面向有资质的机构投资者及某些个人来发行这一可转债.携程已向一家投资方提供选择,允许其在出现超额认购的情况下,在30天内额外购买最多2000万美元的可转债. 这些可转债可被转换为携程的美国存托股份(ADS).目

面试杂记:三个月的面试回忆录(携程、腾讯等)

前话: 话说2年的创业过去了,随着项目的盈利能力越来越弱,基于家庭的压力,不得不暂停创业的步伐,回归到找工作的路程. 于是,就有了这两三个月长短性找工作的心得体会. 前前后后,三个月时间,面试了10家左右,这里就心情的回忆,花个八小时,一次性把所有公司写完了.    以下为各家面试的历程:    朋友推荐:  一大学同学推荐我到一个他旧同事的公司,职位是技术总监了,约了时间过去对方公司聊了聊,地址在体育西那边,感觉聊的不错. 而后归家后,在QQ谈薪水时似乎期望值有点差距,后来没有继续谈下去. 后

去哪儿网产品设计比elong和携程高明之处

ChinaVenture北京时间11月12日上午消息,旅游垂直搜索引擎"去哪儿"宣布获得一笔1500万美元的融资,这是该公司获得的第三轮融资.截至目前,"去哪儿"经过三轮融资实际获得了2700万美元. 在武凯从产品设计角度看来,"去哪儿"获得投资人的青睐一点不足为怪,因为在目前同类市场上,相对"elong"和携程,去哪儿的产品设计明显要高于前两者. 随手拎出两点: 1,在订购飞机票页面,去哪儿无论是内容排放逻辑和阅读重点突出明

经典算法(14) 腾讯2012年实习生笔试加分题

之前参加2012年腾讯实习生笔试时,在考场中遇到一道加分题,当时灵光一闪,直接挥笔就解决这道题目 .今天看到学校论坛上有师弟师妹们在询问这题的解法,就写篇博客来分享我的解法吧,也欢迎大家讨论其 它解法. 首先来看题目描述: 三 .加分题 28)给定一数组a[N],我们希望构造数组b [N],其中b[j]=a[0]*a[1]-a[N-1] / a[j],在构造过程中,不允许使用除法: 要求O(1)空间复杂 度和O(n)的时间复杂度: 除遍历计数器与a[N] b[N]外,不可使用新的变量(包括栈临时

欢聚时代笔试题,滴滴出行编程题

感谢赛码网,奇怪的A题设计,bat一轮大企业过去,没A上去几道. intel 笔试: 1.单链表逆置,双向链表删除 2.层次遍历二叉树 3.rand4()生成rand9() 4.非常多的各种指针操作. 面试:完全的问项目 1.stl boost c++中的智能指针,以及其实现原理? 2.b 树的插入 3.代码实现stack 的排序,只能用stack 的基本操作 乐港面试: 服务器实时排名?(和完美世界一个样子) 为啥下午5点review code 的问题. // testofrecursive.