
程序员代码面试指南刷题
一年而已
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
程序员代码面试指南刷题--第九章.设计LRU缓存结构
题目描述设计LRU缓存结构,该结构在构造时确定大小,假设大小为K,并有如下两个功能set(key, value):将记录(key, value)插入该结构get(key):返回key对应的value值[要求]set和get方法的时间复杂度为O(1)某个key的set或get操作一旦发生,认为这个key的记录成了最常使用的。当缓存的大小超过K时,移除最不经常使用的记录,即set或get最久远的。输入描述:第一行两个个整数N, K,表示操作数量以及缓存结构大小接下来N行,第一行一个整数o原创 2020-06-08 08:51:21 · 1054 阅读 · 0 评论 -
程序员代码面试指南刷题--第九章.最大的leftMax与rightMax之差的绝对值
题目描述给定一个长度为N(N>1)的整形数组arr, 可以划分成左右两个部分,左部分为arr[0…K],右部分为arr[K+1…N-1], K可以取值的范围是[0,N-2]。求这么多划分方案中,左部分中的最大值减去右部分最大值的绝对值中,最大是多少[要求]时间复杂度为O(n), 空间复杂度为O(n)输入描述:第一行一个整数N,表示数组长度。接下来一行N个整数,表示数组内的数。输出描述:输出一个整数表示最优答案示例1输入52 7 3 1 1输出6解法一:借助两个数组原创 2020-06-07 09:06:50 · 290 阅读 · 0 评论 -
程序员代码面试指南刷题--第九章.设计有setAll功能的哈希表
题目描述哈希表常见的三个操作时put、get和containsKey,而且这三个操作的时间复杂度为O(1)。现在想加一个setAll功能,就是把所有记录value都设成统一的值。请设计并实现这种有setAll功能的哈希表,并且put、get、containsKey和setAll四个操作的时间复杂度都为O(1)。[友情提示]: C++选手若有需要可以使用unordered_map替换map来将复杂度从O(log n)降为O(1)输入描述:第一行一个整数N表示操作数。接下来N行,每行第一个数字opt代原创 2020-06-07 08:43:42 · 361 阅读 · 0 评论 -
程序员代码面试指南刷题--第九章.蓄水池算法
容量为k的袋子,一共有n个球,使得n>k时袋子里有k个球同时保证没吐出一个球所有球进袋子的概率就是k/i(i为当前一共吐出的数量i>k&&i<=n)解法一:蓄水池算法public int[] getKRands(int k,int max){ if(max<1||k<1) return null; int[] res = new int[Math.min(k,max)]; for(int i=0;i<res.length;i++){ res[原创 2020-06-07 08:18:44 · 295 阅读 · 0 评论 -
程序员代码面试指南刷题--第九章.能否完美地拼成矩形
题目描述每条边不是平行于X轴就是平行于Y轴的矩形,可以用左下角和右上角的点来表示。比如{1, 2, 3, 4},表示的图形如下给定一个N行4列的二维数组matrix,表示N个每条边不是平行于X轴就是平行于Y轴的矩形。想知道所有的矩形能否组成一个大的完美矩形。完美矩形是指拼出的整体图案是矩形,既不缺任何块儿,也没有重合部分[要求]时间复杂度为O(n),额外空间复杂度为O(n)输入描述:第一行一个整数N,表示matrix的行数接下来N行,每行4个整数分别表示矩形的左下角和右上角的点输出描述:若原创 2020-06-06 09:25:32 · 857 阅读 · 0 评论 -
程序员代码面试指南刷题--第九章.折纸问题
题目描述请把一张纸条竖着放在桌子上,然后从纸条的下边向上方对折1次,压出折痕后展开。此时折痕是凹下去的,即折痕突起的方向指向纸条的背面。如果从纸条的下边向上方连续对折2次,压出折痕后展开,此时有三条折痕,从上到下依次是下折痕、下折痕和上折痕。给定一个输入参数N,代表纸条都从下边向上方连续对折N次,请从上到下打印所有折痕的方向。[要求]时间复杂度为O(2^n)),额外空间复杂度为O(1)输入描述:第一行一个整数N。表示对折次数输出描述:输出若干行,若该折痕向下,输出"down",否则输出"up"原创 2020-06-06 08:48:19 · 794 阅读 · 0 评论 -
程序员代码面试指南刷题--第八章.加油站良好出发点问题
题目描述N个加油站组成一个环形,给定两个长度都是N的非负数组oil和dis(N>1),oil[i]代表第i个加油站存的油可以跑多少千米,dis[i]代表第i个加油站到环中下一个加油站相隔多少千米。假设你有一辆油箱足够大的车,初始时车里没有油。如果车从第i个加油站出发,最终可以回到这个加油站,那么第i个加油站就算良好出发点,否则就不算。请返回长度为N的boolean型数组res,res[i]代表第i个加油站是不是良好出发点规定只能按照顺时针走,也就是i只能走到i+1,N只能走到1[要求]时间复杂原创 2020-06-04 09:36:39 · 629 阅读 · 0 评论 -
程序员代码面试指南刷题--第八章.分金条的最小花费
题目描述给定一个正数数组arr,arr的累加和代表金条的总长度,arr的每个数代表金条要分成的长度。规定长度为k的金条分成两块,费用为k个铜板。返回把金条分出arr中的每个数字需要的最小代价。[要求]时间复杂度为O(nlogn),空间复杂度为O(n)输入描述:第一行一个整数N。表示数组长度。接下来一行N个整数,表示arr数组。输出描述:一个整数表示最小代价示例1输入310 30 20输出90解法一:类似哈夫曼树,借助堆实现import java.io.*;impo原创 2020-06-03 09:21:52 · 554 阅读 · 0 评论 -
程序员代码面试指南刷题--第八章.做项目的最大收益问题
题目描述给定两个整数W和K,W代表你拥有的初始资金,K代表你最多可以做K个项目。再给定两个长度为N的正数数组costs[]和profits[],代表一共有N个项目,costs[i]和profits[i]分别表示第i号项目的启动资金与做完后的利润(注意是利润,如果一个项目的启动资金为10,利润为4,代表该项目最终的收入为14)。你不能并行只能串行地做项目,并且手里拥有的资金大于或等于某个项目的启动资金时,你才能做这个项目。该如何选择做项目,能让你最终的收益最大?返回最后能获得的最大资金[要求]时间复杂度原创 2020-06-03 08:53:16 · 968 阅读 · 0 评论 -
程序员代码面试指南刷题--第八章.数组排序之后相邻数的最大差值
题目描述给定一个整形数组arr,返回排序后相邻两数的最大差值arr = [9, 3, 1, 10]。如果排序,结果为[1, 3, 9, 10],9和3的差为最大差值,故返回6。arr = [5, 5, 5, 5]。返回0。[要求]时间复杂度为O(n),空间复杂度为O(n)输入描述:第一行一个整数N。表示数组长度。接下来N个整数表示数组内的元素输出描述:输出一个整数表示答案示例1输入49 3 1 10输出6解法一:桶排序import java.io.*;impor原创 2020-06-02 11:40:54 · 838 阅读 · 0 评论 -
程序员代码面试指南刷题--第八章.数组中未出现的最小正整数
题目描述给定一个无序数组arr,找到数组中未出现的最小正整数例如arr = [-1, 2, 3, 4]。返回1arr = [1, 2, 3, 4]。返回5[要求]时间复杂度为O(n),空间复杂度为O(1)输入描述:第一行为一个整数N。表示数组长度。接下来一行N个整数表示数组内的数输出描述:输出一个整数表示答案示例1输入4-1 2 3 4输出1解法一:双指针import java.io.*;import java.util.*;public class Main原创 2020-06-02 09:35:18 · 336 阅读 · 0 评论 -
程序员代码面试指南刷题--第八章.求最短通路值
题目描述用一个整形矩阵matrix表示一个网格,1代表有路,0代表无路,每一个位置只要不越界,都有上下左右四个方向,求从最左上角到右下角的最短通路值例如,matrix为:1 0 1 1 11 0 1 0 11 1 1 0 10 0 0 0 1通路只有一条,由12个1构成,所以返回12[要求]时间复杂度为O(nm),空间复杂度为O(nm)输入描述:第一行两个整数N,M表示矩形的长宽接下来N行,每行一个长度为M的字符串表示矩形输出描述:输出一个整数表示最小步数若从(1, 1)无法到原创 2020-06-02 09:03:05 · 378 阅读 · 0 评论 -
程序员代码面试指南刷题--第八章.边界都是1的最大正方形大小
题目描述给定一个N×N的矩阵matrix,在这个矩阵中,只有0和1两种值,返回边框全是1的最大正方形的边长长度、例如0 1 1 1 10 1 0 0 10 1 0 0 10 1 1 1 10 1 0 1 1其中,边框全是1的最大正方形的大小为4×4,所以返回4[要求]时间复杂度为O(n3),空间复杂度为O(n2)输入描述:第一行一个整数N。表示矩阵的长宽。接下来N行,每行N个整数表示矩阵内的元素输出描述:输出一个整数表示答案示例1输入50 1 1 1 10 1 0原创 2020-06-01 09:09:41 · 457 阅读 · 0 评论 -
程序员代码面试指南刷题--第八章.打印N个数组整体最大的Top K
题目描述有N个长度不一的数组,所有的数组都是有序的,请从大到小打印这N个数组整体最大的前K个数。例如,输入含有N行元素的二维数组可以代表N个一维数组。219, 405, 538, 845, 971148, 55852, 99, 348, 691再输入整数k=5,则打印:Top 5: 971, 845, 691, 558, 538[要求]时间复杂度为O(klogk),空间复杂度为O(klogk)输入描述:第一行两个整数T, K。分别表示数组个数,需要打印前K大的元素接下来T行,每行输入原创 2020-05-31 11:02:49 · 602 阅读 · 0 评论 -
程序员代码面试指南刷题--第八章.数组中子数组的最大累乘积
题目描述给定一个double类型的数组arr,其中的元素可正、可负、可0,返回子数组累乘的最大乘积。例如,arr=[-2.5, 4, 0, 3, 0.5, 8, -1],子数组[3, 0.5, 8]累乘可以获得最大的乘积12,所以返回12[要求]时间复杂度为O(n)O(n)O(n),空间复杂度为O(1)O(1)O(1)输入描述:第一行一个整数N。表示数组长度。接下来一行N个浮点数表示数组内的数输出描述:输出一个浮点数表示答案,保留到小数点后两位示例1输入7-2.5 4 0 3 0.原创 2020-05-31 10:04:52 · 525 阅读 · 2 评论 -
程序员代码面试指南刷题--第八章.在数组中找到一个局部最小的位置
题目描述定义局部最小的概念。arr长度为1时,arr[0]是局部最小。arr的长度为N(N>1)时,如果arr[0]<arr[1],那么arr[0]是局部最小;如果arr[N-1]<arr[N-2],那么arr[N-1]是局部最小;如果0<i<N-1,既有arr[i]<arr[i-1],又有arr[i]<arr[i+1],那么arr[i]是局部最小。给定无序数组arr,已知arr中任意两个相邻的数不相等。写一个函数,只需返回arr中任意一个局部最小出现的位置即可原创 2020-05-31 08:55:58 · 277 阅读 · 0 评论 -
程序员代码面试指南刷题--第八章.子矩阵的最大累加和问题
题目描述给定一个矩阵matrix,其中的值有正、有负、有0,返回子矩阵的最大累加和例如,矩阵matrix为:-90 48 7864 -40 64-81 - 7 66其中,最大的累加和的子矩阵为:48 78-40 64-7 66所以返回累加和209。例如,matrix为:-1 -1 -1-1 2 2-1 -1 -1其中,最大累加和的子矩阵为:2 2所以返回4[要求]时间复杂度为O(n^2m),空间复杂度为O(nm)输入描述:第一行有两个整数N,M。分别表示矩阵的行数/原创 2020-05-26 10:41:15 · 235 阅读 · 0 评论 -
程序员代码面试指南刷题--第八章.子数组的最大累加和问题
题目描述给定一个数组arr,返回子数组的最大累加和例如,arr = [1, -2, 3, 5, -2, 6, -1],所有子数组中,[3, 5, -2, 6]可以累加出最大的和12,所以返回12.[要求]时间复杂度为O(n),空间复杂度为O(1)输入描述:第一行一个整数N。表示数组长度接下来一行N个整数表示数组内的元素输出描述:输出一个整数表示答案示例1输入71 -2 3 5 -2 6 -1输出12解法一:遍历import java.io.*;import jav原创 2020-05-26 09:29:43 · 285 阅读 · 0 评论 -
程序员代码面试指南刷题--第八章.奇数下标都是奇数或者偶数下标都是偶数
题目描述给定一个长度不小于2的数组arr,实现一个函数调整arr,要么让所有的偶数下标都是偶数,要么让所有的奇数下标都是奇数注意:1、数组下标从0开始!2、本题有special judge,你可以输出任意一组合法解!同时可以证明解一定存在[要求]时间复杂度为O(n),额外空间复杂度为O(1)输入描述:第一行一个整数N。表示数组长度接下来一行N个整数表示数组内的数输出描述:输出N个整数。表示调整后的数组示例1输入51 2 3 4 5 输出2 1 4 3 5说明样例中原创 2020-05-26 09:07:53 · 281 阅读 · 0 评论 -
程序员代码面试指南刷题--第八章.计算数组的小和
题目描述数组小和的定义如下:例如,数组s = [1, 3, 5, 2, 4, 6],在s[0]的左边小于或等于s[0]的数的和为0;在s[1]的左边小于或等于s[1]的数的和为1;在s[2]的左边小于或等于s[2]的数的和为1+3=4;在s[3]的左边小于或等于s[3]的数的和为1;在s[4]的左边小于或等于s[4]的数的和为1+3+2=6;在s[5]的左边小于或等于s[5]的数的和为1+3+5+2+4=15。所以s的小和为0+1+4+1+6+15=27给定一个数组s,实现函数返回s的小和[要求]原创 2020-05-25 10:21:48 · 471 阅读 · 0 评论 -
程序员代码面试指南刷题--未排序数组中累加和为给定值的最长子数组系列问题补2
题目描述给定一个无序数组arr,其中元素只能是1或0。求arr所有的子数组中0和1个数相等的最长子数组的长度[要求]时间复杂度为O(n),空间复杂度为O(n)输入描述:第一行一个整数N,表示数组长度接下来一行有N个数表示数组中的数输出描述:输出一个整数表示答案示例1输入51 0 1 0 1输出4解法一:利用map思路:把0当-1,求相加和为0的最大数组长度import java.io.*;import java.util.*;public class Main{原创 2020-05-25 09:01:44 · 338 阅读 · 0 评论 -
程序员代码面试指南刷题--第八章.未排序数组中累加和为给定值的最长子数组系列问题补1
题目描述给定一个无序数组arr,其中元素可正、可负、可0。求arr所有子数组中正数与负数个数相等的最长子数组的长度。[要求]时间复杂度为O(n),空间复杂度为O(n)输入描述:第一行一个整数N,表示数组长度接下来一行有N个数表示数组中的数输出描述:输出一个整数表示答案示例1输入51 -2 1 1 1输出2解法一:同样利用map思路:把正数当成1,负数当成-1,求相加和为0的结果import java.io.*;import java.util.*;public原创 2020-05-25 08:58:29 · 372 阅读 · 0 评论 -
程序员代码面试指南刷题--第八章.在数组中找到出现次数大于n/k的数
题目描述给定一个整型数组arr,再给定一个整数k,打印所有出现次数大于n/k的数,如果没有这样的数,请打印”-1“。输入描述:输入包含两行,第一行输入包含两个整数n和k,第二行包含n个整数,代表数组arr。输出描述:输出所有出现次数大于n/k的数,如果没有这样的数,请输出”-1“。示例1输入7 71 2 3 1 2 3 4输出1 2 3解法一:利用mapimport java.io.*;import java.util.*;public class Main{原创 2020-05-24 09:38:41 · 728 阅读 · 0 评论 -
程序员代码面试指南刷题--第八章.在数组中找到出现次数大于一半的数
题目描述给定一个整型数组arr,请打印其中出现次数大于一半的数,如果没有这样的数,请输出-1。输入描述:输入包含两行,第一行包含一个整数n,代表数组长度,第二行包含n个数,代表数组arr。输出描述:输出一个整数,代表出现次数大于一半的数,如果没有这样的数,请输出‘-1“。示例1输入511 7 5 7 7输出7解法一:两两相消import java.io.*;import java.util.*;public class Main{ public static v原创 2020-05-24 08:42:15 · 682 阅读 · 0 评论 -
程序员代码面试指南刷题--第八章.需要排序的最短子数组长度
题目描述给定一个无序数组arr,求出需要排序的最短子数组的长度,对子数组排序后能使得整个数组有序,即为需要排序的数组。例如:arr=[1,5,3,4,2,6,7]返回4,因为只有[5,3,4,2]需要排序。输入描述:输入包含两行,第一行包括一个整数n,代表数组arr长度,第二行n个整数,代表数组arr。输出描述:输出一个整数,代表需要排序的最短子数组的长度。示例1输入71 5 3 4 2 6 7输出4解法一:从右往左找,从左往右找import java.io.*;impo原创 2020-05-23 09:52:04 · 373 阅读 · 0 评论 -
程序员代码面试指南刷题--第八章.找到无序数组中最小的k个数
题目描述给定一个整型数组arr,找到其中最小的k个数。输入描述:输入包含两行,第一行包含两个整数n和k,代表数组arr的长度,第二行包含n个整数,代表数组arr。输出描述:输出包含一行,k个整数,代表数组中最小的k个整数。示例1输入5 33 5 1 5 2输出3 1 2解法一:利用堆import java.io.*;import java.util.*;public class Main{ public static void main(String[] arg原创 2020-05-23 09:20:10 · 433 阅读 · 0 评论 -
程序员代码面试指南刷题--第八章.之字形打印矩阵
题目描述给定一个矩阵matrix,按照“之”字形的方式打印这个矩阵,如样例所示。输入描述:输入包含多行,第一行包含两个整数n和m,代表矩阵的行数和列数,接下来n行,每行m个整数,代表矩阵matrix。输出描述:输出一行 ,代表“之”字形输出的矩阵。示例1输入4 41 2 3 45 6 7 89 10 11 1213 14 15 16输出1 2 5 9 6 3 4 7 10 13 14 11 8 12 15 16解法一:夹逼import java.io.*;impor原创 2020-05-22 09:28:33 · 265 阅读 · 0 评论 -
程序员代码面试指南刷题--第八章.将正方形矩阵顺时针旋转90度
题目描述给定一个n*n的矩阵matrix,请把这个矩阵顺时针转动90度。输入描述:输入包含多行,第一行一个整数n,代表矩阵的行数和列数,接下来n行,每行n个整数,代表矩阵matrix。输出描述:输出旋转后的矩阵(包含n行,每行n个数)。示例1输入41 2 3 45 6 7 89 10 11 1213 14 15 16输出13 9 5 114 10 6 215 11 7 316 12 8 4解法一:夹逼import java.io.*;import java.u原创 2020-05-22 09:01:49 · 463 阅读 · 1 评论 -
程序员代码面试指南刷题--第八章.转圈打印矩阵
题目描述给定一个整型矩阵matrix,请按照顺时针转圈的方式打印它。输入描述:输入包含多行,第一行两个整数n和m,代表矩阵的行数和列数,接下来n行,每行m个整数,代表矩阵matrix。输出描述:输出包含一行,n*m个整数,代表顺时针转圈输出的矩阵matrix。示例1输入4 41 2 3 45 6 7 89 10 11 1213 14 15 16输出1 2 3 4 8 12 16 15 14 13 9 5 6 7 11 10解法一:设置两个夹角import java.i原创 2020-05-22 08:38:28 · 321 阅读 · 0 评论 -
程序员代码面试指南刷题--第七章.在其它数都出现k次的数组中找到只出现一次的数
题目描述给定一个整型数组arr和一个大于1的整数k。已知arr中只有1个数出现了一次,其他的数出现k次,请返回出现了1次的数。输入描述:输入包含两行,第一行包含两个整数n和k,n代表数组arr的长度,第二行n个整数,代表数组arr,数组arr中每个数都是32位整数。输出描述:输出一个整数,代表唯一出现1次的数。示例1输入7 35 4 1 1 5 1 5输出4解法一:先转成K进制数k进制数的k个数第i位数不进位相加对k取余是0import java.io.*;import原创 2020-05-20 11:25:48 · 509 阅读 · 0 评论 -
程序员代码面试指南刷题--第七章.位运算常用操作
1.消除最右边1的两种操作1. n = n&(n-1)2. n = n-n&(~n+1)2.只取出最右边1n = n&(~n+1)3.两数交换a = a^b;b = a^b;a = a^b;原创 2020-05-20 11:23:37 · 195 阅读 · 0 评论 -
程序员代码面试指南刷题--第七章.在其它数出现次数都为偶数的数组中找到出现次数为奇数次的数
题目描述给一个数组arr,其中只有一个数出现了奇数次,其它数出现了偶数次,打印这个数。输入描述:输出包含两行,第一行包含一个整数n(1≤n≤105)(1 \leq n \leq 10^5)(1≤n≤105),代表数组arr长度,第二行有n个数,代表数组arrarri为32位整数arr_i 为32位整数arri为32位整数。输出描述:输出一个整数,代表出现次数为奇数次的那个数。示例1输入53 1 3 1 2输出2示例2输入36 6 3输出3解法一:异或i原创 2020-05-20 08:23:48 · 548 阅读 · 0 评论 -
程序员代码面试指南刷题--第七章.整数的二进制数表达中有多少个1
题目描述给定一个32位整数n,返回该整数二进制形式1的个数。输入描述:输入一个整数,代表n,n为32为整数。输出描述:输出一个整数,代表n的二进制表达式中1的个数。示例1输入1输出1示例2输入-2输出31解法一:循环遍历import java.io.*;import java.util.*;public class Main{ public static void main(String[] args) throws Exception{原创 2020-05-20 08:16:20 · 236 阅读 · 0 评论 -
程序员代码面试指南刷题--第七章.不用算术运算符实现整数的加减乘除运算
题目描述给定两个32位整数a和b。要求不使用算术运算符,分别实现a和b的加减乘除运算。如果给定的a和b执行加减乘除的某些结果本来就会导致数据的溢出,那么你实现的函数不需要对那些结果负责(你的输出和加减乘除溢出的结果保持一致就行)。输入描述:输出一行,包含两个整数a和b(a和b均为32位整数)和一个运算符,运算符为“+”,“-”,“*”,""中的一个。(数据保证不会出现除0的情况)输出描述:输出一个整数,为上述表达式计算出的结果。示例1输入2 * 4输出8解法一:位运算除法有些原创 2020-05-19 11:01:26 · 452 阅读 · 0 评论 -
程序员代码面试指南刷题--第七章.不用做任何比较判断运算符找出两个整数中的较大的值
题目描述给定两个32位整数a和b,返回a和b中较大的,要求不能用任何比较判断运算符。输入描述:输出两个整数a和b,a和b均为32位整数。输出描述:输出一个整数,两个数中较大的那一个。示例1输入1 0输出1解法一:先减,根据此值判断,为防止溢出中间处理一下import java.io.*;import java.util.*;public class Main{ public static void main(String[] args) throws Except原创 2020-05-19 09:47:55 · 362 阅读 · 0 评论 -
程序员代码面试指南刷题--第七章.不用额外变量交换两个整数的值
题目描述不用额外变量交换两个整数的值。输入描述:输出一行,包含两个整数n和m(−109≤n,m≤109)(-10^9 \leq n,m \leq 10^9)(−109≤n,m≤109)。输出描述:输出交换后的n和m的值。示例1输入2 3输出3 2解法一:异或import java.io.*;import java.util.*;public class Main{ public static void main(String[] args) throws Exce原创 2020-05-19 09:21:03 · 199 阅读 · 0 评论 -
程序员代码面试指南刷题--第六章.岛问题
给定一个二维数组,其中只有0,1。每个位置都与其上下相邻,如果是一堆1连成一片,那就称为岛。返回岛的数量。解法一public int countIslands(int[][] m) { if(m==null||m[0]==null) return 0; int N = m.length; int M = m[0].length; int res = 0; for(int i=0;i<N;i++) { for(int j=0;j<M原创 2020-05-18 10:47:27 · 230 阅读 · 0 评论 -
程序员代码面试指南刷题--第六章.一致性哈希算法
题目工程师使用服务器集群来设计和实现数据缓存无论是添加、查询还是删除数据,都先将数据的id通过哈希函数装换成一个哈希值,记为key如果目前机器有N台,则计算key%N的值,这个值就是该数据所属的编号分析此问题弊端并改进。弊端有可能造成所有数据经过哈希函数后都交给一台服务器去处理,另外当添加或者删除机器时需要重新哈希计算确定数据交给哪一个机器去处理。解决方案把哈希函数能算出的范围做成一个闭环,机器根据机器号哈希处理后也在闭环中的某一个位置,数据经过哈希处理后必然也在某一个位置上,顺时针找到原创 2020-05-18 10:21:23 · 180 阅读 · 0 评论 -
程序员代码面试指南刷题--第六章.40亿个非负整数中找到出现两次的数和所有数的中位数
题目32位无符号整数的范围为0-4294967295,现在有40亿个无符号整数,可以使用最多1GB内存,找出所有出现了两次的数。解题申请bitMap大小为4294967295*2;其中每2位代表一个数,这两位中00代表出现0次,01出现1次,10出现2次,11出现3次。如果遍历过程中发现已经是11了则继续遍历下一个即可。之后再次遍历所有整数找出比特位10的数。补充问题40亿个非负整数最多使用10MB的内存,怎么找到这40亿个整数的中位数解题还是先根据内存划分最大可用区间的大小,然后遍历所有数统原创 2020-05-18 10:09:22 · 284 阅读 · 0 评论 -
程序员代码面试指南刷题--第六章.找到100亿个URL中重复的URL及搜索词汇的TopK问题
题目有一个包含100亿的URL文件,假设每个URL占用64B,请找出其中所有重复的URL。解题把大文件通过哈希函数分配到机器,或者通过哈希函数把大文件拆分为小文件,之后一直划分知道内存、时间等要求。例如,将100亿字节的大文件通过哈希函数分配到100台机器上,然后每台机器分别统计分给自己的URL中是否有重复的URL,一般小文件查看是否有重复可以使用哈希表遍历或者排序后查看。补充问题查看搜索关键词中的Top 100解题关键词哈希分流,满足硬件要求后对小文件处理。一般方法为建立大小为100的小根原创 2020-05-18 09:47:22 · 446 阅读 · 0 评论