拼多多-提前批0722(算法工程师)笔试总结

题目总览

本次笔试题一共有四道算法题目,难度都不算很大,总的来说是考察基础能力加上一些思考能力。不同的岗位笔试题目是不同的。算法工程师岗位四道编程题,题目没有截图没有保存,只是凭印象介绍,分别如下:

1.最长山谷

在一维数组中,保存着自然数,找出其子连续序列的长度,子序列满足先减小后增大。也就是类似“V”一样的山谷。一定满足先减小增大,没有等于,子序列长度一定要大于3,否则为0。

例如:

输入:[1,2,3,3,1,5]

输出为:3

输入:[1,2,3,2,1]

输出为:0

思路

用flag的方式判断此时在什么位置,如果是下降,遇到后项小的,那就继续下降,如果后项更大,那就开始上升,如果后项相等,那就直接丢弃重新考虑。如果是上升,遇到后项小的,那就说明上升结束,和最大的长度比较一下,遇到后项大的,那就继续上升,如果相等,也是结束上升,和最大长度比较。

小的trick:在数列的初始位置添加一个 -1,结束位置添加一个-1,这样在判断的时候可以不需要考虑首位,比较容易考虑。

2.重复字符串

输入一个字符串S,然后找到其最小的循环子序列P。对于每一个S[i],S[i] = P[i%P_len]. P_len是P的长度。S长度小于100.

例如:

输入:abcabca

输出:abc

输入:abcdd

输出:abcdd

思路

由于S的长度不超过100,所以直接考虑使用一个两层循环的暴力来解决了。一个个比对就好了,最后的时候比对需要稍微注意一下,因为可能不能完全整除,所以需要比对一部分的数据。

3.一维生物左右走

有一个一维生物,只能在X坐标系上面左右走。第一步走一个坐标系,第二步走两个坐标系,以此类推。初始位置在X = 0,目标位置为输入,输出为最小的步数。

例如:

输入为:6 

输出为 : 3

(往右第1步到1,往右第2步到3,往右第3步到6)

输入为:2

输出为:3

(往右第一步到1,往左第二步到-1,往右第三步到2)

思路

这个题说起来当时没有时间做了,我下来想了一下,思路还是很清楚的,可以跟大家分享一下。

首先把这个可以考虑成 1+2+3+4+5...所有的步伐都往右走。如果刚好遇到一个数字,例如是10,那就4步就好了,因为直达。但是如果是8呢,我四步到了以后发现越过了,那行,越过了两步,那就在1的时候如果是往左,那就刚好相差两步了。所以应该是 1+2+3+4 然后第一步往左,变成 -1+2+3+4,这样得到的结果就是8了。那如果目标是9呢,因为10-9是1,没办法使用10来改变得到,所以可以再多一步,也就是1+2+3+4+5=15,这时候比9多了6,然后第三步往左就可以了。

到这个时候,问题已经解决了。也就是看目标值target所在累加的哪个值后面,如果累加到了n,再考虑n和target分别%2是否相同,如果相同,就是n步,如果不同,还需要再加一步。

例如:100   累加  1+2+...+14 = 105.并且 100 %2 != 105%2,所以一共14步+1步就可以啦。

4.靓号

给定一个字符串S,全都是数字,然后给定一个k,希望S中相同的字符串能够满足K个,修改一个字符的消耗为字符间的差值。输入为字符串和K,输出为消耗和修改后的字符串,如果消耗相同,输出字典序小的字符串。

例如:

输入为: 1233321 5

输出为     2    1333331 

输入为: 99987776 4

输入为  1 99987777

思路

这个类似通排序,提前存好每一个值的数目,然后依次判断什么时候才可以满足K个的条件,先判断减小的情况,再判断增加的情况。其中还需要记录一下相同的cost最小的那个字典序就行。这是一个纯粹的模拟题,需要考虑的样例还是挺多的。细心判断就好~

你可能感兴趣的:(秋)