
进军硅谷---程序员面试揭秘 GO语言代码实现
qq_35191331
这个作者很懒,什么都没留下…
展开
-
面试题15: 两数组中值
两个有序数组A和B,分别拥有m和n的长度,求其合并后的值原创 2018-05-17 08:32:45 · 234 阅读 · 0 评论 -
面试题9:数组配对
题目:给定N个整数,N为偶数,是否能找到N/2对,使得每队和都能被k整除。注意:每个元素只能出现在一个配对中。观察: 如果某个数能被k整除,那么该数除以k的余数为零。假设a和b之后能被k整除,即(a+b)%k=0,如果a%b=z,那么当z不等于0时,b%k=k-z;当z等于时,b%k=0。通过上面的推导,我们需要记录这个数组除以k之后的余数情况。然后从余数里找出配对。 使用额外一个数...原创 2018-05-08 09:05:17 · 662 阅读 · 0 评论 -
面试题8:合并区间
题目:给定一个区间集合,合并里面重叠区间;并返回新的不含重叠区间的集合。例如,输入:[1,5],[6,10],[4,6],[15,20]。输出:[1,10],[15,20]。package mainimport ( "fmt" "sort")type Interval struct { start int end int}type PointSlice []Pointf...原创 2018-05-08 08:28:12 · 601 阅读 · 0 评论 -
面试题7:插入区间
题目:给定一个没有叠加的区间序列,现插入一个新的区间到该序列中,要求维持没有重叠的情况。假设该系列存放的区间有序的,区间定义如题目“重叠区间个数”。举例: 假定我们已有两个不重叠而且排好序的区间:[1,5],[6,10],现插入一个新的区间[4,6],那么最后结果是[1,10]。代码实现:package mainimport ( "fmt")type Interval struct {...原创 2018-05-07 20:37:15 · 223 阅读 · 0 评论 -
面试题6:重叠区间个数
题目:给定多个可能重叠的区间,找出重叠区间的个数。举例 输入:[1,5],[10,15],[5,10],[20,30] 输出:3解法一:常规解法,就是我们一上来,最先想到的方法就是使用暴力破解,直接扫描,先第一个区间开始,看这个区间是不是在后面其他区间里面,两两区间判断是否重叠的方式,用一个数组存放区间是否存在重叠,如果两个区间重叠,比如第一个区间和第五个区间重叠,则把数组下标0,4这...原创 2018-05-07 17:14:45 · 3097 阅读 · 0 评论 -
面试题21: 二维数组搜索
题目: 设计一个算法对 m*n 矩阵进行搜索,这个矩阵拥有如下属性. 1)每行的数都是从左到右排序好的. 2)每行的首数大于上行的尾数.其实这题就是用二分查找算法,二分查找一般是在一维数组上进行搜索,解决这道题的关键就是如何将二维数组映射成一维数组.映射关系为: k=i*n+j,j<n,k为在一维数组的中的下标值,i,j分别为二维数组中的行和列.根据前面的可以推导出i=k/n,j...原创 2018-05-19 15:45:54 · 378 阅读 · 0 评论 -
面试题20: 三角形
题目: 给定一个正整数n,产生Pascal三角形的前n行.代码实现:package mainimport "fmt"var a [100][100] intfunc init() { for i := 0;i < 100;i++ { a[i][0] = 1 for j := 1;j <= i;j++ { a[i][j] = a[i - 1][j - 1] +...原创 2018-05-19 15:14:23 · 517 阅读 · 0 评论 -
面试题19: 合并有序数组
题目: 给定两个有序数组A和B,把B合并到A里,保持结构有序.假设A有足够的空间容纳B的元素.初始时,A和B的元素各有m个和n个.分析: 这题可以这样来,从A和B的末尾向前移动,进行比较,将比较大的值放到A中下标为len(A)+len(B)-1的地方(假设两个序列是从小到大排列的),之后比较大的值的序列往前一个,然后再比较,放到len(A)+len(B)-2的地方,重复前面的操作,直到两个序列合并...原创 2018-05-19 15:03:33 · 471 阅读 · 0 评论 -
面试题10:数位重组
题目:给定两个数组表示的整数,比如x = 1234={1,2,3,4},y=2410={2,4,1,0},返回第一个整数的重组后的值最接近第二个整数,并且要大于第二个整数。假设两个整数的数组大小相同,并且肯定能够找到符合答案的数,例如输入{1,2,3,4},{2,4,1,0},返回{2,4,1,3}。package mainimport ( "fmt")func getClose...原创 2018-05-12 19:49:16 · 674 阅读 · 0 评论 -
面试题5:最大下标距离
题目:给定一个整型数组A,找出最大下标距离j-i,当且仅当 A[i]<A[j]和i<j书中给出的思路:思路一:常规我们最直观想到的解决方法是(1)i=0,j=end(end为最后下标所在位置),max=0(2)如果A[i]<A[j],j-i>max,则max=j-i(3)i++,j=end(4)重复第二、第三步骤,直到i==j这种算法的时间复杂度是 1+2+...+n-1 ...原创 2018-05-05 22:59:31 · 580 阅读 · 0 评论 -
面试题4:数组旋转
题目:返回将一维数组向右旋转k个位置的结果。比如,一维数组{1,2,3,4,5},k=2时,返回结果时{4,5,1,2,3}。要求常数级空间复杂度,允许修改原来数组。书中给出的思路: 如果允许额外分配线性空间,那么可以错位复制原有数组的元素。如果允许修改原有数组,那么我们可以通过三次反转数组来实现数组旋转,不需要申请额外空间,并且每次反转时间为O(n),从而实现线性的时间复杂度和常数级的空间...原创 2018-05-05 21:20:45 · 244 阅读 · 0 评论 -
面试题3:两数之和
题目:设计一个类,包含如下两个成员函数: Save(int input) 插入一个整数到一个整数集合里,整数集中可以存在相同值。 Test(int target) 检验是否存在两个数和为输入值。如果存在这两个数,则返回true,否则返回false。书中给出的解析:这题相比上一题,只要把<值,下标>改成<值,个数>,第一次遍历将数组存到哈希表里面;第二...原创 2018-05-05 20:19:32 · 598 阅读 · 0 评论 -
面试题2:两数之和 2
题目:给定一个整型的数组,找出其中的两个数使其和为某个指定的值,并返回这两个数的下标(数组下标是从0开始)。假设数组元素的值各不相同,则要求时间复杂度为O(n),n为数组的长度。书中给出的核心思想:利用哈希函数,因为题意给出的是数组元素的值各不相同,所以第一次可以以键值<value,index>方式存入哈希表中;第二次扫描的时候,检查这个target与当前值的差值是否在哈希表中,且这个...原创 2018-05-05 16:22:20 · 252 阅读 · 0 评论 -
面试题1:两数之和 1
题目:给定一个整型数组,能否找到找出其中的两个数使其和为某个指定的值?(这个数组是无序的)直接实现(暴力解决):// 暴力破解,O(n^2)的时间复杂度func hasSum(arr []int, target int) bool { length := len(arr) for i := 0;i < length;i += 1 { for j := i + 1;j < le...原创 2018-05-05 16:01:44 · 197 阅读 · 0 评论 -
面试题18: 首个正数
题目: 给定一个无序整型数组,找出第一个不在数组里的正整数.要求时间复杂度O(n),空间复杂度为O(l).举例: 输入数组{5,3,-1,1},返回2代码实现:package mainimport "fmt"// 解法1,使用哈希思想,空间复杂度为O(n)func hxqj(a []int) int { m := make(map[int]bool) for _, v := ...原创 2018-05-18 09:33:11 · 271 阅读 · 0 评论 -
面试题17: 旋转数组搜索
题目: 给定一个有序数组的旋转和一个目标值,返回目标值在该数组的下标,如果不存在,则返回-1.假设该数组没有重复值.代码实现:使用二分查找package mainimport "fmt"func Min(a, b int) int { if a > b { return b } return a}func searchRotatedArray(A []int, tar...原创 2018-05-17 14:23:41 · 599 阅读 · 1 评论 -
面试题16: 旋转数组最小值
题目: 输入一个递增排序的一个旋转,输出旋转数组的最小值.分析:第一步:要知道什么是旋转数组?其实就是将一个有序的数组,前n个直接丢到最后面. 根据上面什么是旋转数组,我们可以知道旋转数组会有这样一个规律,就是这个一个递增排序数组的一个旋转,可以看成两个递增数组的组合.有一个核心的地方,就是左边序列的所有值会大于等于右边的值,那么我们就可以使用二分查找.第二步:使用二分查找,中间的要么在第一...原创 2018-05-17 13:18:58 · 205 阅读 · 0 评论 -
面试题14: 两数组第K个值
题目: 两个有序数组A和B,分别拥有m和n的长度,求其合并后的第k个值.代码实现:// 二分归并排序func binaryMerge(arr1, arr2 []int) interface{} { i, j, la1, la2, temp := 0, 0, len(arr1), len(arr2), 0 var ms []int for i < la1 && j &...原创 2018-05-16 11:27:36 · 244 阅读 · 0 评论