笔面试试题
文章平均质量分 68
3Sunremitting
优秀是一种习惯,堕落也是一种习惯
展开
-
数字签名和数字证书
基本密码学知识1、加密方法可以分为两大类:一类是单钥加密(private key cryptography),还有一类叫做双钥加密(public key cryptography)。前者的加密和解密过程都用同一套密码,后者的加密和解密过程用的是两套密码。历史上,人类传统的加密方法都是前一种,比如二战期间德军用的Enigma电报密码。莫尔斯电码也可以看作是一种私钥加密方法。在单钥加密的情况下,密钥只有一把,所以密钥的保存变得很重要。一旦密钥泄漏,密码也就被破解。在双钥加密的情况下,密钥有两把,一把是公转载 2021-06-30 16:01:55 · 385 阅读 · 0 评论 -
找出不在数组中的最小的那个数字
题目描述:给定一个数组a=[4,23,8,9,12,1,2,5,3],在这个数组中,6没有出现,所以6是不在数组中的最小的数字。解题思路:主要是使用数组的一个特性,设数组中的数据是A[1]、A[2]、、、、、A[n],如果该数组中存在未被使用过的数,那么max(A)>n。这个特性类似于抽屉原理,因为总共n个数,如果每个数都被使用过,则最后到达第n个位置的时候,肯定有A[n]=n(这里假设下标是从1开始的)。由此,根据这个特性,便可以给出如下代码。代码实现:# 不在数组中的最小的数字def原创 2020-09-08 23:19:13 · 330 阅读 · 0 评论 -
高频面试题:部分排序
题目描述给定一个整数数组,编写一个函数,找出索引m和n,只要将索引区间[m,n]的元素排好序,整个数组就是有序的。注意:n-m尽量最小,也就是说,找出符合条件的最短序列。函数返回值为[m,n],若不存在这样的m和n(例如整个数组是有序的),请返回[-1,-1]。# 部分排序def subSort(arr): n=len(arr) maxx,minn=-float('inf'),float('inf') l,r=-1,-1 for i in range(n):原创 2020-09-08 22:44:22 · 212 阅读 · 0 评论 -
20200823腾讯笔试题
题目描述:现有n个人,要从这n个人中选任意数量的人组成一只队伍,再在这些人中选出一名队长,求不同的方案对10^9+7取模的结果。如果两个方案选取的人的集合不同或选出的队长不同,则认为这两个方案是不同的。分析:因为选择过程与顺序无关,从n个不同元素中取出m个元素的组合数为c(n,m)。则总的方案数为1 * C(n,1)+2 * C(n,2)+3 * C(n,3)+4 * C(n,4)+…n * C(n,n)根据数学公式推导,最终上面组合式结果为n2^(n-1)。思路:因此问题转化为求 n2^(n-原创 2020-08-23 20:37:20 · 343 阅读 · 0 评论 -
0815:携程笔试
有a、b两种长度的瓷砖,从中任选k块,输出所有可能铺出的道路长度# 有a、b两种长度的瓷砖,从中任选k块,输出所有可能铺出的道路长度def divingBoard(a,b,k): if k==0: return [] else: ans=set() for i in range(0,k+1): sum=i*a+(k-i)*b ans.add(sum) return list(sorte原创 2020-08-16 11:10:13 · 189 阅读 · 0 评论 -
动态规划:蜗牛爬井问题
动态规划:蜗牛爬井问题一只蜗牛白天爬4米,晚上掉2米,n米的井,蜗牛几天才能爬出来def costDay(n): if n==0: return 0 elif n<=4: return 1 else: ans=[] ans.append(0) ans.append(2) i = 2 ans_temp=0 while 1: a原创 2020-08-16 10:27:50 · 1484 阅读 · 0 评论 -
dfs实现任意n个数的全排列
arr=[4,7,3,8] # 这里可以把它替换成任意的数组a=[0 for i in range(10)] #存放每一种组合遍历过程中的数字book=[0 for i in range(10)] #标记数组n=3def dfs(step): # 尝试每一种可能 for num in arr: if book[num]==0: a[step]=num book[num]=1 dfs(step+1原创 2020-08-15 21:12:53 · 225 阅读 · 0 评论 -
动态规划:青蛙跳台阶问题
问题描述:青蛙可以一次跳一个台阶,也可以一次跳两个台阶,总共有10层台阶,青蛙有多少种选择动态规划:设第n层的最多选择为Stage(n),根据题意,可得如下状态转移方程:Stage(n)=Stage(n-1)+Stage(n-2)如果n=10,则上述的意思就是第十层的选择等于第九层的选择数+第八层的选择数。(这是因为青蛙一次可以跳一个台阶,也可以一次跳两个台阶,当青蛙在第八层和第九层时都可以达到第十层)def Stage(n): if n<0: return -1原创 2020-08-14 22:23:49 · 579 阅读 · 0 评论 -
动态规划:斐波那契数列
斐波那契数列一般是使用递归来做,但是用递归来做当数量很大时,往往会超时。所以可以使用动态规划来做。def fib(n): dp=[] if n<0: return -1 if n==0: return 0 if n==1: return 1 else: dp.append(0) dp.append(1) for i in range(2,n+1):原创 2020-08-14 22:05:08 · 131 阅读 · 0 评论 -
动态规划:求解金矿问题
题目描述:很久很久以前,有一个国王拥有5座金矿,每座金矿的黄金储量不同,需要参与挖掘的工人人数也不相同。例如:有的金矿存储量是500kg黄金,需要5个工人来挖;有的金矿存储量是200kg黄金,需要3个工人来挖…如果参与挖矿的工人总数是10,每座金矿要么全挖,要么不挖,不能派出一半人挖取一半的金矿,想要得到尽可能多的黄金,应该选择挖哪几座金矿?数据信息如下:工人:共10名200kg黄金/3人;300kg黄金/4人;400kg黄金/5人;500kg黄金/5人;350kg黄金/3人;求:挖哪几座金矿才原创 2020-08-12 10:56:22 · 466 阅读 · 0 评论 -
0805华为笔试题:找出一个文本中有多少匹配的模式
def Method(str1,str2): i,j=0,0 ans=0 for _ in range(len(str1)): while i<len(str1): if str1[i] != str2[0]: i += 1 else: break while j<len(str1): if str1..原创 2020-08-05 21:59:47 · 220 阅读 · 0 评论 -
LeetCode:两个链表的第一个公共节点(Python)
def Method(arrA,arrB): a=len(arrA) b=len(arrB) if a<b: arrA,arrB,a,b=arrB,arrA,b,a dis=a-b for i in range(dis,b): if arrA[i]==arrB[i-dis]: return arrA[i] return Noneif __name__=="__main__": arr..原创 2020-08-04 21:02:18 · 164 阅读 · 0 评论 -
拼多多笔试题:飞行棋(Python)
if __name__=="__main__": K,N=map(int,input().strip().split()) array=list(map(int,input().strip().split())) ht = 0 if(K!=0): for i in range(len(array)): if K == array[i]: K = K - array[i] ...原创 2020-08-02 19:45:47 · 747 阅读 · 0 评论 -
leetcode:调整数组顺序使奇数位于偶数前面(首尾双指针、快慢指针)
# 调整数组顺序,使奇数位于偶数前# method1:首尾双指针def Method1(arr): left=0 right=len(arr)-1 while left<right: while arr[left]%2!=0: # 如果left指向的是奇数就一直向右移 left += 1 while arr[right]%2==0: # 如果right指向的是偶数就一直向左移 right...原创 2020-08-01 22:10:55 · 290 阅读 · 0 评论 -
LeetCode:和为s的两个数,双指针(碰撞指针)
# 和为s的两个数:双指针(碰撞指针)def Method(arr,target): i=0 j=len(arr)-1 while i<j: s=arr[i]+arr[j] if s>target: j -= 1 elif s<target: i += 1 else: return arr[i],arr[j] retur.原创 2020-08-01 21:52:49 · 160 阅读 · 0 评论 -
LeetCode:找重复的数字(Python)
#寻找重复的数def Method(arr): i=0 while i<len(arr): if arr[i]==i: i += 1 continue # 第一次遇到数字 xx时,将其交换至索引 x 处; # 而当第二次遇到数字 x 时,一定有 nums[x] = x # 此时即可得到一组重复数字。 if arr[arr[i]]==arr[i]: .原创 2020-08-01 18:02:32 · 155 阅读 · 0 评论 -
笔试题:找亲戚(Python列表全排列,找能被7整除的数)
对于列表中的数字进行全排列,然后寻找能被7整除的数。def Method(arr,p,q): if p==q: s.append(list(arr)) else: for i in range(p,q): arr[i],arr[p]=arr[p],arr[i] Method(arr,p+1,q) arr[i],arr[p]=arr[p],arr[i]s=[]res=0arr=li原创 2020-08-01 17:23:06 · 1391 阅读 · 0 评论 -
LeetCode:数组中出现次数超过一半的数字(Python)
# 数组中出现次数超过一半的数字def Method(arr): vetos=0 for num in arr: if vetos==0: res=num vetos += 1 if res==num else -1 return resif __name__=='__main__': array=list(map(int,input().strip().split())) print(Metho...原创 2020-08-01 14:33:59 · 259 阅读 · 0 评论 -
LeetCode:和为n的连续正数序列(Python)
# 和为n的连续正数序列def SumN(n): l=1 r=2 res=[] while l<r: sumN=((l+r)*(r-l+1))/2 if n==sumN: tep=[] for i in range(l,r+1): tep.append(i) l += 1 res.append(tep) ..原创 2020-08-01 11:38:13 · 593 阅读 · 1 评论 -
LeetCode:求一个数的二进制位中1的个数(Python)
def Numof1(n): res=0 while n: res += 1 n &= (n-1) return resif __name__=='__main__': n=int(input()) print(Numof1(n))原创 2020-08-01 11:11:18 · 230 阅读 · 0 评论 -
LeetCode:合并两个有序链表,合并后仍然有序(Python)
def JoinList(l1,l2): res=[] l1_len=len(l1) l2_len=len(l2) i=0 j=0 while i<l1_len and j<l2_len: if l1[i]>l2[j]: res.append(l2[j]) j += 1 else: res.append(l1[i]); .原创 2020-07-31 22:57:17 · 177 阅读 · 0 评论 -
LeetCode:替换空格(Python)
# 注意:在Python中,字符串是不可变类型,不能对一个已经定义好的字符串作出修改# 可以从列表下手,再把列表转化成字符串def ThSpace(s): res=[] for c in s: if c==' ': res.append('%20') else: res.append(c) return ''.join(res)if __name__=='__main__': s=inp.原创 2020-07-31 20:21:55 · 146 阅读 · 0 评论 -
LeetCode:从尾到头打印链表(python)
def Reverselink(arr): return arr[::-1]if __name__=='__main__': head=list(map(int,input().strip().split())) print(Reverselink(head))原创 2020-07-31 18:07:11 · 161 阅读 · 0 评论 -
LeetCode:打印从1到最大的n位数(Python)
def printNumbers(n): return list(range(1,10**n))if __name__=='__main__': n=int(input()) print(printNumbers(n))原创 2020-07-31 17:59:08 · 205 阅读 · 0 评论 -
LeetCode:求链表中倒数第k个节点(Python)
题目描述:输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有6个节点,从头节点开始,它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个节点是值为4的节点。解题思路:**解法一:**先遍历统计链表长度,记为 n ;设置一个指针走 (n-k)步,即可找到链表倒数第 k 个节点。解法一代码:if __name__=='__main__': Linklist=list(map(int,input().st原创 2020-07-31 15:43:07 · 285 阅读 · 0 评论 -
20200722阿里笔试题1:输出n个数(C/C++),全排列思想的应用
题目描述:有n个物品编号为1-n,现将其重新排列,但要求相邻两物品的编号差值的绝对值不等于1,按字典序输出所有满足要求的方案。输入描述:每组输入一个整数n,1<=n<=10;输出描述:对于每组测试数据:按照字典序输出满足要求的序列,若没有满足的,不用输出任何东西。示例:输入:4输出:2 4 1 33 1 4 2思路:利用全排列的思想,先进行全排列,当存在相邻两数的差值为1时即为不满足条件的排序。去除不满足条件的排序即可。#include<cstdio>#in原创 2020-07-22 10:50:49 · 526 阅读 · 1 评论 -
N进制转化为10进制的两种方法(Python)
今天第一次发现N进制转10进制竟然有两种方法,除了经常用的那一种之外,还有一种方法。话不多说,开始讲解方法吧:假设我们有一个26进制的数 : 123,要把它转化为10进制的数Q,两种方法分别如下:方法一:Q=3*(260)+2*(261)+1*(262)=3+52+676=731方法二:Q=(1*26+2)*26+3=731为了验证方法二的准确性,我们编程验证一下:Python代码如下:def fun1(N,jinzhi): Q=0 product=1 while N !原创 2020-07-01 16:36:14 · 3033 阅读 · 1 评论 -
经典解电报的题目来啦(C/C++和Python)
题目描述:有一行电文,已按如下规律译成密码:A–>Z a–>zB–>Y b–>yC–>X c–>x… …即第一个字母变成第26个字母,第i个字母变成第(26-i+1)个字母,非字母字符不变。要求根据密码译回原文,并输出。做这个题主要是转化的方法:当是小写字母时,转化前后的字母ASCII 码相加总是为219;当是大写字母时,转化前后的ASCII码相加总是155.C++程序如下:#include&原创 2020-06-14 22:20:36 · 978 阅读 · 0 评论 -
C/C++解决杨辉三角形
直接上代码喽~#include<cstdio>int main(){ int a[100][100]; int n; scanf("%d",&n); for(int i=0;i<n;i++) { for(int j=0;j<i+1;j++) { if(j==0||j==i) # 该第一或者最后一个元素为1 { a[i][j]=1; } else { a[i][j]=a[i-1][j-1]+a[i-1][j原创 2020-06-14 21:21:24 · 331 阅读 · 0 评论 -
杨辉三角形(超级简单的Python实现方法)
杨辉三角形大家都知道,那么在这里就不再介绍了,大家肯定都用C/C++实现过杨辉三角形,是把数据存放在了一个二维数组里,那么如何让用Python来实现杨辉三角形呢?我查看了网上的很多方法,都很麻烦,有的还用到了生成器,那我们来看看简单的方法吧!其实,在Python中,二维数组就可以用列表的列表来表示。在这里,我们就把数据存放在列表的列表中。在杨辉三角形中,有一个很大的规律:就是每一行的第一个和最后一个都是1,那中间的数据是怎么生成的呢?中间的数据其实就是一个公式:(假设n表示行,m表示列)list原创 2020-06-14 20:59:39 · 26100 阅读 · 3 评论 -
简单的查找算法来啦!二分查找(Python)
一、二分查找简介二、代码实现一、二分查找简介二分查找是非常简单的一种查找方法,它接收一个列表和一个元素,如果这个元素在这个列表里,就返回该元素所在的位置,否则返回None。二分查找也可以说是折半查找,它每次能排除一般的数据。它的具体过程如下:1、设立low和high分别指向列表的第一个和最后一个元素,mid=(low+high)/22、查看mid所指向的元素和我们要查找的元素a的大小,如果mid<a,则修改low的值,low=mid+1反之,修改high的值,high=mid-13、直原创 2020-06-05 16:16:14 · 114 阅读 · 0 评论 -
BitMap的巧用(简单示例)Python
最近一周都没怎么更新博文,实际上也没有做什么有用的事情,感觉这样下去把自己刚刚开的头又半途而废了。唉!不能让自己生活在舒适圈啊,要努力学习,加油!今天要说的是BitMap的使用,了解BitMap的人都知道BitMap可以在短时间内对海量数据去重,排序和查询,用处还是很大的。一、BitMap简介二、BitMap代码实现一、BitMap简介BItMap算法在中文里叫做位图算法,它是指内存中连续的二进制(bit)所组成的数据结构,该算法主要用于对大量整数做去重和查询操作。BitMap的位运算是其另一个原创 2020-06-05 15:47:08 · 417 阅读 · 0 评论 -
A*寻路算法(Python)
一、题目描述在一个迷宫游戏里,有一些小怪物要去攻击主角,现在希望给这些小怪物加上聪明的AI,让他们可以自动绕过迷宫中的障碍物,寻找到主角所在。二、解题思路迷宫游戏里的场景通常都是由小方格组成。假设我们有一个7*5大小的迷宫,图中红色格子是终点,绿色格子是起点,蓝色格子是一堵墙。...原创 2020-05-28 16:33:43 · 2881 阅读 · 2 评论 -
分红包算法(Python)
一、题目描述线上发红包功能,红包功能需要满足以下具体规则:1、所有人抢到的金额之和要等于红包金额,不能多也不能少。2、每个人至少抢到1分钱。3、要保证红包拆分的金额尽可能分布均衡,不要出现两极分化太严重的情况。二、解题思路二倍均值法假设剩余红包金额是m元,剩余人数是n,那么有如下公式:每次抢到的金额=随机区间[0.01,m/n * 2-0.01]元假设有5个人,红包总额为100元:100/5 * 2 =40,所以第一个人抢到的金额的随机范围是[0.01,39.99]元,在正常情况下,平均原创 2020-05-26 15:39:05 · 2785 阅读 · 1 评论 -
寻找缺失的整数:三(Python)
一、问题描述假设一个无序数组里有若干个正整数,范围1~100,其中有98个整数出现了偶数次,只有两个整数出现了奇数次,如何找到这2个出现奇数次的整数?二、问题求解原创 2020-05-26 10:23:38 · 281 阅读 · 0 评论 -
寻找缺失的整数:二(Python)
一、题目描述一个无序数组里有若干个整数,原创 2020-05-25 18:12:13 · 299 阅读 · 0 评论 -
寻找缺失的整数:一(Python)
一、题目描述在一个无序数组里有99个不重复的正整数,范围是1~100。唯独缺少一个1到100的整数,如何找到这个缺失的整数。二、解题思路1、方法一创建一个哈希表,以1到100这100个整数为Key 。然后遍历整个数组,每读到一个整数,就定位到哈希表中对应的Key,然后删除这个Key .直到最后,只剩下一个Key值没有被删除,剩下的这个数就是缺失的整数。该方法时间复杂度为O(n) ,空间复杂度为O(n).2、方法二先把数据元素从小到大进行排序,然后遍历已经有序的数组,如果发现两个相邻元素并不连续原创 2020-05-25 09:37:33 · 1187 阅读 · 0 评论 -
如何找到两个数组中的中位数(Python)
一、题目描述给定两个升序数组,如何找到这两个数组归并以后新的升序数组的中位数?(如果新的数组长度为奇数:中位数为中间的元素;如果数组长度为偶数,中位数为中间两个元素的平均值。)简单的方法:可以直接对两个数组进行归并操作,进而求得中位数。但这种方法效率不高,时间复杂度为O(m+n)二、解题思路中位数:中位数把一个升序数组分成了长度相等的两个部分,其中左半部分的最大值永远小于或等于右半部分的最小值。设有两个初始数组A和B,它们归并后的大数组为C,则大数组的左右部分,分别来源于两个初始数组A和B的左右部原创 2020-05-24 15:41:13 · 1015 阅读 · 0 评论 -
删除k个数字后的最小值(贪心算法:Python)
一、题目描述给出一个整数,从该整数中去除k个数字,要求剩下的数字形成的新整数尽可能小。如:1593212,删除3个数字后的,新整数的最小情况是121230200,删除一个数字,新整数的最小情况是200二、解题思路这个题可以用贪心算法来解,每次求出删除一个数字后,让剩下数字形成的新整数达到最小。像这样依次取得局部最优解,最终得到全局最优解的思想,叫做贪心算法。如何做到删除一个整数后,让剩下的数字最小呢?其主要思想是把高位的数字降低。 把原整数的所有数字从左到右进行比较,如果发现某一位数字大于它原创 2020-05-24 10:44:00 · 2192 阅读 · 1 评论 -
寻找全排列的下一个数(Python)
一、题目描述给出一个数,找出这个正整数所有数字全排列的下一个数。即:在一个整数所包含数字的全部组合中,找到一个大于且仅大于原数的新整数。如:如果输入12345,则返回12354;如果输入12354,则返回12435二、解题思路首先当这5个数字逆序组合时最大:54321;顺序组合时最小:12345为了得到比原数稍大的下一个数,我们需要尽量保持高位不变,低位在最小的范围内变换顺序。至于变换顺序的范围大小,则取决于当前整数的逆序区域。比如:12354,要想获得比它大的下一个数,则需要从倒数第三原创 2020-05-23 22:22:08 · 626 阅读 · 0 评论