快手b卷笔试,总结
第一题,挺简单,就是给一个可能不规范的算式,比如:a*(b+c)))(b-a)((等,让你求有几个相对应的括号对,有几个多出来的左,右括号。
答:用栈很容易作出。
第二题,也挺简单,就是给俩数int R,int N,要求R是N的什么幂的什么和,看一遍例题明白了,举例:(39,3),那么39=3^1+3^2+3^3,所以返回数组[1,2,3],(41,3)则返回空。
答:思路是由于N>=2时,一个数的n次幂必定大于前n-1任意不重复的次幂之和(2^3=8,必定大于2^2+2^1+2^0等)。先一遍循环找到最大的幂,以(39,3)举例,找到4,此时3^4=81大于39了。
然后再往回循环,用R=39能减就减(R-3^3-3^2-3^1),减到头后,如果R剩下的数等于0就把减的过程中记住的数打包成数组返回,否则返回new int[0]。
需要注意的是N=1的情况。
第三题,假设一群人在食堂排队,从头到尾记为1到n,一个人有俩属性A[i]和B[i],他的位置为j(j即为i+1,如排在头部的j=1),他的不满意度为A[i](j-1)-B[i](n-j),给出A和B俩数组,求这群人不满意度总和最小。
这道题其实不难,刚开始我第一反应是动态规划,将不满意度式子转化成j(A[i]-B[i])+B[i]*n - A[i],后面的值固定,A[i]-B[i]固定,设V[i] = A[i] - B[i],也就是说求V[1] * W[1](它的位置,1,2,,,n)+。。。+V[n]*W[n]的最小值。
然后动态规划忘记了,学了二十分钟,回头要做时发现这问题压根就不用动态规划。。。
求出V作为这群人的价值数组后,要想最小值,只要把最大的放前面,最小的放后面就完事了。也就是说一个排序。(应该是这样,我没做完)
那么为啥我最后没做完呢,因为我是杀币。
我在本地跑的时候,结果总是出问题,研究了几十分钟,才发现我把 A[i] - B[i]写成 A[i] + B[i]了。最后两分钟才发现,看一下时间也就够写个排序算法了。遂放弃。
第四题,没答到。
就前三道来说,难度应该是适中的,除了像我这种加号减号搞错的憨批,多数人应该都答上了,祝贺各位。。
#快手笔试##快手##校招##笔经#