是时候刷笔试题目了
基础很差,计算机操作系统,组成原理,网络都不懂.我就以题带学了
https://www.nowcoder.com/contestRoom?filter=0&orderByHotValue=1&mutiTagIds=179&page=1
就从美团做起.
美团点评2017秋招笔试编程题 全部自己写的ac代码.都是左神讲过的题目!自己掌握还是不好.
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#美团2017笔试 ''' 给你六种面额 1、5、10、20、50、100 元的纸币,假设每种币值的数量都足够多, 编写程序求组成N元(N为0~10000的非负整数)的不同组合的个数。 ''' a=input() a=int(a) memo={} list1=[1,5,10,20,50,100] def main(num,a):#只用[1,5,10,20,50,100][:num+1]来组合答案多少来组a元:背包问题 if (num,a) in memo: return memo[(num,a)] if num==0: return 1 maxi=a//list1[num] output=0 for i in range (maxi+1): output+=main(num-1,a-list1[num]*i) memo[(num,a)]=output return output print(main(5,a)) ''' 大富翁游戏,玩家根据骰子的点数决定走的步数,即骰子点数为1时可以走一步,点数为2时 可以走两步,点数为n时可以走n步。求玩 家走到第n步(n<=骰子最大点数且是方法的唯一入参)时,总共有多少种投骰子的方法。 ''' a=input() a=int(a) def main(num): if num==0: return 0 if num==1: return 1 if num-1>=0: tmp= main(num-1)+1 if num-2>=0: tmp= main(num-2)+tmp if num-3>=0: tmp= main(num-3) +tmp if num-4>=0: tmp= main(num-4) +tmp if num-5>=0: tmp= main(num-5) +tmp if num-6>=0: tmp= main(num-6) +tmp return tmp print(main(a)) #第三题单调栈比较复杂先写最后一个 #第四题:修改kmp算法.kmp只是判断a是不是b的子串.好像直接动态规划就行. #第四题: ''' 给出两个字符串(可能包含空格),找出其中最长的公共连续子串,输出其长度。 ''' a=input() b=input() if len(a)>len(b): a,b=b,a def main(a,b): if len(a)==0 or len(b)==0 or a==None or b==None or a=='' or b=='': return 0 maxi=0 for i in range(len(a)): for j in range(len(a),i,-1): for ii in range(len(b)): jj=ii+j-i if a[i:j]==b[ii:jj]: out=j-i if maxi<out: maxi=out return maxi print(main(a,b)) ''' disanti ''' ''' 第三题: [编程题] 最大矩形面积 时间限制:1秒 空间限制:32768K 给定一组非负整数组成的数组h,代表一组柱状图的高度,其中每个柱子 的宽度都为1。 在这组柱状图中找到能组成的最大矩形的面积(如图所示)。 入参h为一个整型数组,代表每个柱子的高度,返回面积的值。 单调栈即可,并且是一个不用处理重复值的单调栈,比较简单 ''' chang=input() list1=input().split(' ') chang=int(chang) for i in range(len(list1)): list1[i]=int(list1[i]) zhan=[] i=0 area=0 while i<chang:#zhan中维护的是索引 tmp=list1[i] if len(zhan)==0: zhan.append(i) i+=1 continue if tmp>list1[zhan[-1]]: zhan.append(i) i+=1 else: now=list1[zhan.pop()] if zhan!=[]: areanow=(i-zhan[-1]-1)*now if areanow>area: area=areanow else: areanow=(i)*now if areanow>area: area=areanow #都弹完了还剩一些元素,继续处理即可. for i in range(len(zhan)-1,-1,-1): if i !=0: areanow=list1[zhan[i]]*(chang-zhan[i-1]-1) if areanow>area: area=areanow if i==0: areanow=list1[zhan[i]]*(chang) if areanow>area: area=areanow print(area) ''' 7 2 2 5 6 2 3 2 你妈第三题改了好多遍才过,写的虽然逻辑对,但是确实很别扭,和繁琐. n = int(input()) h = [int(x) for x in input().split()]#我靠,原来大神是这么写的读取数据 '''
美团点评2016研发工程师在线编程题
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
''' 美团点评2017秋招笔试真题-运维工程师B 太惨了,就42分 我就是坚持以题带学,这样能速成一点,基础不会以后慢慢补吧. TCP/IP: 数据链路层:ARP,RARP 网络层: IP,ICMP,IGMP 传输层:TCP ,UDP,UGP 应用层:Telnet,FTP,SMTP,SNMP. ''' ''' 美团点评2017秋招笔试真题-算法工程师A 我操大数据题目这么多我,几乎全错. 只是前面数据结构的基本都对了 ABCD都是降维的常用方法: A. Latent Dirichlet Allocation把文档投影到了“topic”空间,可以理解为降维 B. word2vec 是它在给定的语料库上训练一个模型,输出出现在语料库上中单词的向量(word embedding)表示,NLP中传统的词表示方法是把每个单词表示成dim(词汇量大小)维的稀疏向量,这个稀疏向量只有一个维度(该单词的index)上是1,其余全是0,单词之间孤立,word embedding则是把单词的表示降维到n维的稠密向量,n<<dim。 C. PCA不用说,有降维的作用 D. 自编码也很好理解,隐藏层的神经元数目少于输入就可以看做降维和压缩 以下哪些是防止过拟合可以采用的方法?() 扩增测试数据集不对,应该是扩增训练数据集 L1正则可以使少数权值较大,多数权值为0,得到稀疏的权值;L2正则会使权值都趋近于0但非零,得 到平滑的权值; 在AdaBoost算法中,被错分的样本的权重更新比例的公式相同; Boosting和Bagging都是组合多个分类器投票的方法,但Boosting是根据单个分类器的正确率决定其权 重,Bagging是可简单地设置所有分类器权重相同; EM算法不能保证找到全局最优值; SVR中核函数宽度小欠拟合,宽度大容易过拟合 生成式模型 判别式分析 朴素贝叶斯 K近邻(KNN) 混合高斯模型 隐马尔科夫模型(HMM) 贝叶斯网络 Sigmoid Belief Networks 马尔科夫随机场(Markov Random Fields) 深度信念网络(DBN) 判别式模型 线性回归(Linear Regression) 逻辑斯蒂回归(Logistic Regression) 神经网络(NN) 支持向量机(SVM) 高斯过程(Gaussian Process) 条件随机场(CRF) CART(Classification and Regression Tree) SMO是二次规划算法,SVM就是用这个解的 ''' ''' 美团点评2016研发工程师在线编程题 求字典序在s1和s2之间的,长度在len1到len2的字符串的个数,结果mod 1000007。 非常经典的一个题目!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ab ce 1 2 输出例子1: 56 ''' #这个题目还是比较新的可以试试. #print(ord('a')) #print(chr(ord('a')))#chr 可以ascii码变字符 ''' 原来是这样,先考虑这个子问题就够了: 考虑比aaa大比zwk小的长度为3的字符串即可. ''' #牛客的python 编译器有问题.但是我写的对的. a=input().split(' ') str1=a[0] str2=a[1] first=int(a[2]) end=int(a[3]) def main(str3,kai ,end):#返回比str3小比 'a'大的字符串的个数.长度从kai到end双包含.也 #就是从字典的第一个字符算起 count=0 for i in range(kai,end+1): #i是当前位数 if i <len(str3): for j in range(i): count+=(ord(str3[j])-ord('a'))*26**(i-j-1) count+=1#加str3[:i]这个情况 if i ==len(str3): for j in range(i): count+=(ord(str3[j])-ord('a'))*26**(i-j-1) if i >len(str3):#这个情况复杂,但是分析之后发现跟上面一样,就是循环里面改了 for j in range(len(str3)): count+=(ord(str4[j])-ord('a'))*26**(i-j-1) return count print(main(str2,first,end)-main(str1,first,end)-1)
原来上面的字符串题目需要用while 包一下就行了.他需要处理的是多组数据
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
while 1: try: a=input().split(' ') str1=a[0] str2=a[1] first=int(a[2]) end=int(a[3]) def main(str3,kai ,end):#返回比str3小比 'a'大的字符串的个数.长度从kai到end双包含.也 #就是从字典的第一个字符算起 count=0 for i in range(kai,end+1): #i是当前位数 if i <len(str3): for j in range(i): count+=(ord(str3[j])-ord('a'))*26**(i-j-1) count+=1#加str3[:i]这个情况 if i ==len(str3): for j in range(i): count+=(ord(str3[j])-ord('a'))*26**(i-j-1) if i >len(str3):#这个情况复杂,但是分析之后发现跟上面一样,就是循环里面改了 for j in range(len(str3)): count+=(ord(str4[j])-ord('a'))*26**(i-j-1) return count print(main(str2,first,end)-main(str1,first,end)-1) except: break
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
''' [编程题] 奇数位丢弃 时间限制:1秒 空间限制:32768K 对于一个由0..n的所有数按升序组成的序列,我们要进行一些筛选,每次我们取当前所有数字中 从小到大的第奇数位个的数, 并将其丢弃。重复这一过程直到最后剩下一个数。请求出最后剩下的数字。 ''' #先写暴力的:原来只需要while 1 try except包一下就行了.他需要输入的是多组数据. #while 1: # try: # a=int(input()) # def main(num): # num=range(num+1) # k=[] # for i in num: # k.append(i) # while len(k)>1: # k=k[1::2] # return k[0] # print(main(a)) # except: # break #真正的解决是用2进制来处理这个问题. ''' 比如:0,1,2,3,4,5那么做用一次是1,3,5 第i次删除的是2进制表达倒数第i个位置是0的数. 所以最后的数一定是2进制表达全是1的数.也就是说def main(n)返回比n小=的最大的2进制表达全是1的数即可. ''' #牛逼代码 while 1: try: a=int(input()) def main(n): a=bin(n) a=a[2:] if a=='1'*len(a): return int(a,2) else: return int('1'*(len(a)-1),2) print(main(a)) except: break #问题完结!
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
''' [编程题] 股票交易日 时间限制:3秒 空间限制:32768K 在股市的交易日中,假设最多可进行两次买卖(即买和卖的次数均小于等于2),规则是必须一笔 成交后进行另一笔(即买-卖-买-卖的顺序进行)。给出一天中的股票变化序列,请写一个程序计算一 天可以获得的最大收益。请采用实践复杂度低的方法实现。 给定价格序列prices及它的长度n,请返回最大收益。保证长度小于等于500。 显然是左神说的预处理数组问题 ''' ''' [编程题] 股票交易日 时间限制:3秒 空间限制:32768K 在股市的交易日中,假设最多可进行两次买卖(即买和卖的次数均小于等于2),规则是必须一笔 成交后进行另一笔(即买-卖-买-卖的顺序进行)。给出一天中的股票变化序列,请写一个程序计算一 天可以获得的最大收益。请采用实践复杂度低的方法实现。 给定价格序列prices及它的长度n,请返回最大收益。保证长度小于等于500。 显然是左神说的预处理数组问题,当然这个题目的预处理数组实在是操作非常多!不难但是多. ''' class Stock: def maxProfit(self, prices, n): #先做一个left left[i]表示第i天卖会最大赚多少钱. left=[0] list1=prices mini=list1[0] for i in range(len(list1)): if i==0: continue if list1[i]<mini: mini=list1[i] left.append(list1[i]-mini) else: left.append(list1[i]-mini) #再做一个right right[i]表示股票只有prices[i:]会最大赚多少 list1=prices right=[] maxi=prices[-1] for i in range(len(list1)-1,-1,-1): if i==len(list1)-1: right.append(0) continue if list1[i]>maxi: maxi=list1[i] right.append(0) else: right.append(maxi-list1[i]) right=right print(left) print(right) out=[0] #处理最大值 maxi=left[0] for i in range(len(left)): if left[i]<maxi: left[i]=maxi else: maxi=left[i] maxi=right[0] for i in range(len(right)): if right[i]<maxi: right[i]=maxi else: maxi=right[i] print(left) print(right) right=right[::-1] for i in range(len(list1)-2): out.append(left[i]+right[i+1]) return max(out) a=Stock()
s刷百度:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
''' [编程题] 有趣的排序 时间限制:1秒 空间限制:32768K 度度熊有一个N个数的数组,他想将数组从小到大 排好序,但是萌萌的度度熊只会下面这个操作: 任取数组中的一个数然后将它放置在数组的最后一个位置。 问最少操作多少次可以使得数组从小到大有序? 输入描述: 首先输入一个正整数N,接下来的一行输入N个整数。(N <= 50, 每个数的绝对值小于等于1000) 输入例子1: 4 19 7 8 25 输出例子1: 2 这题目好难!!!!!!!!!!!!想了接近2个小时 应该思考一下对于算法问题的整体思路该如何. 1.找数据结构依附的已经经常使用的算法看看差别和变形.(还是转化思想,看跟已经会的有什么不同,做转化) 2.直接问题自己解决自己也就是(递归) (基本就这2个思路)模拟过程找思路 ''' a=input() b=[int(i) for i in input().split(' ')] def main(list1): assist=[0]*len(list1) #0表示这个数位的数不动,1表示动 for i in range(len(list1)): #维护动的最大数值,和不动的最小数值. #新插入的数,首先把它前面的数比他大的都标记为动. #插入一个数如果他比前面不动的都大 这个新数就标记不动 效率N^2 else:biaoji dong if i==0: continue for ii in range(i): if list1[ii]>list1[i]: assist[ii]=1 for ii in range(i): if list1[ii]<list1[i] and assist[ii]==1: assist[i]=1 count=0 for i in assist: if i==1: count+=1 return (count) print(main(b))
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
''' 三维空间中有N个点,每个点可能是三种颜色的其中之一,三种颜色分别是红绿蓝 ,分别用'R', 'G', 'B'表示。 现在要找出三个点,并组成一个三角形,使得这个三角形的面积最大。 但是三角形必须满足:三个点的颜色要么全部相同,要么全部不同。 ''' #原来空间三角形用 向量的叉积来算. def chaji(xiangliang1,xiangliang2): i1=xiangliang1[0] j1=xiangliang1[1] i2=xiangliang2[0] j2=xiangliang2[1] out=[i1*j2-i2*j1,j1-j2,i2-i1] mianji=abs(out[0])//2 return out,mianji print(chaji([1,2],[3,4]))
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
''' 链接:https://www.nowcoder.com/questionTerminal/adc291e7e79f452c8b59243a5ce68d3a 来源:牛客网 首页 > 试题广场 > 有趣的排序 [编程题]有趣的排序 热度指数:15246 时间限制:1秒 空间限制:32768K 算法知识视频讲解 度度熊有一个N个数的数组,他想将数组从小到大 排好序,但是萌萌 的度度熊只会下面这个操作: 任取数组中的一个数然后将它放置在数组的最后一个位置。 问最少操作多少次可以使得数组从小到大有序? 链接:https://www.nowcoder.com/questionTerminal/adc291e7e79f452c8b59243a5ce68d3a 来源:牛客网 思路来自于: 我才是你爸爸 若是没有看懂他的讲解的话,可以看看我的理解,希望对大家有帮助! 思路: 其实可以想象成是一个从小到大递增的数组A中插入了若干数字导致数组A变成了无序的 数组B。 我们的任务就是把插入的若干数组挪到最后即刻。 比如说:数组B:[6, 1, 7, 2, 5, 4] 是从数组A:[1, 2, 4]插入了数字6, 7, 5. 因此 需要挪动3次。 再比如:数组B:[5, 2, 4, 3, 1, 6] 是从数组A:[1]插入了数字5,2,4,3,6. 因此需 要挪动5次。 会发现规律,挪动的次数就是B.length - A.length ''' ''' 牛逼 我来实现一下看看对不对. ''' a=input() b=[int(i) for i in input().split(' ')] def main(list1): a=list1.copy() nums=list1 index = sorted(range(len(nums)), key = lambda i: nums[i]) a.sort() #找到i开始的上升序列.不用严格上升. i=0 for ii in range(len(list1)):#找到数组A if list1[ii]==a[i]: i+=1 return len(list1)-i print(main(b))