手撕代码记录贴
才发现牛客网发帖子是可以编辑的T……T
春招接近尾声,自己尚有很多很多的不足,尤其是现场代码能力方面需要加强。
接下来一段时间会整理各路大佬的手撕代码题目和题解,希望大家多多发自己面试遇到的题目啦~
因为是自己写的,不一定是最优解,欢迎小伙伴们来讨论哇~~
(自己只熟悉Python,所以。。。,还是好好学习C++吧)
自己遇到的:
1. 剑指offer 判断节点环 (快慢指针求解)
2. 翻转数组
b[j*col+i]=a[i*row+j]
3. 有序数组二分查找目标值
class Solution(object): def mySqrt(self, x): """ :type x: int :rtype: int """ start=0 end=(x+1)/2 while(start<end): mid=start+(end-start)/2 tmp=mid*mid if(tmp==x): return mid elif tmp<x: start=mid+1 else: end=mid-1 tmp=end*end if(tmp>x): return end-1 else: return end
5. Leetcode 4. Median of Two Sorted Arrays 有序数组的中位数
思路:分治
class Solution(object): def findDigit(self,nums1,nums2,idx): if len(nums1)>len(nums2): return self.findDigit(nums2,nums1,idx) if len(nums1) == 0: return nums2[idx-1] if idx == 1: return min(nums1[0],nums2[0]) l1_mid = min(idx/2,len(nums1)) l2_mid = idx-l1_mid if nums1[l1_mid-1] <= nums2[l2_mid-1]: return self.findDigit(nums1[l1_mid:],nums2,l2_mid) else: return self.findDigit(nums1,nums2[l2_mid:],l1_mid) def findMedianSortedArrays(self,nums1,nums2): ''' :param nums1: List[int] :param nums2: List[int] :return: float ''' total_length = len(nums1) + len(nums2) if total_length%2 == 1: return self.findDigit(nums1,nums2,total_length/2+1) else: return (self.findDigit(nums1,nums2,total_length/2)+self.findDigit(nums1,nums2,total_length/2+1))*0.5
========别人面试遇到的题目=======
1. Leetcode 85. Maximal Rectangle (头条、腾讯)
思路:转化Leetcode 84 求直方图中的最大面积问题,单调栈求解
class Solution(object): def maximalRectangle(self,matrix1): m = len(matrix1) if m == 0: return 0 n,maxValue = len(matrix1[0]),0 dp = [[0 for i in range(n)] for j in range(m)] for i in range(m): for j in range(n): if i==0 and matrix1[i][j] == '1': dp[i][j] = 1 if i>0 and matrix1[i][j]=='1': dp[i][j] = dp[i-1][j]+1 for col in range(m): maxValue=max(maxValue,self.largestRectangleArea(dp[col])) return maxValue def largestRectangleArea(self, heights): heights.append(0) stack = [] area = 0 for i,h in enumerate(heights): if stack == [] or heights[stack[-1]]<=h: stack.append(i) else: while(stack and heights[stack[-1]]>h): idx = stack.pop() left = stack[-1] if stack else -1 area = max((i-left-1)*heights[idx],area) stack.append(i) return area