===12.14更新===
获得了feedback,一面Hire,二面三面No Hire。
反而是感觉良好的两轮No Hire.
一面:尝试多次且没要提示(good)。
二面:花了太多时间且没要提示(bad)。
三面:问题分析和系统思维not good,CS背景not good,coding过于复杂且有bug。
feedback尖锐深刻,是秋招获得的最有价值的信息和资料,等价于一个北京28w的offer。
===原帖===
一面leetcode 297 准hard
二面leetcode 1358 准hard
三面leetcode 4 hard
三轮全是hard,无提示撕出。三面hard只20分钟,撕出最优解,依然被吐槽,第二天收到感谢信。
虽然败了,但我是败的一点都不服的!
===11.28更新===
有老哥觉得我有点过于纠结于最优解了。
所以在此贴一下代码,从而表达为何我过于纠结:
20分钟白板撕出,34行处加上 '||' 可AC leetcode第四题。
复杂度O(log(min(m,n))). 算法导论解。
public int getKth(int[] arr1, int[] arr2, int k) { if (arr1 == null || arr2 == null) { throw new RuntimeException("Invalid Input Arrays"); } int [] longArr = arr1.length > arr2.length ? arr1 : arr2; int [] shortArr = longArr == arr1 ? arr2 : arr1; int longLen = longArr.length, shortLen = shortArr.length; if (k < 1 || k > longLen + shortLen) { throw new RuntimeException("Invalid k"); } if (shortLen == 0) return longArr[k - 1]; if (k <= shortLen) { return getUpMedianOfTwoSortedEqualLenArrays(shortArr, 0, k - 1, longArr, 0, k - 1); } else if (k <= longLen) { if (longArr[k - shortLen - 1] >= shortArr[shortLen - 1]) { return longArr[k - shortLen - 1]; } return getUpMedianOfTwoSortedEqualLenArrays(shortArr, 0, shortLen - 1, longArr, k - shortLen, k - 1); } // k > longLen && k < longLen + shortLen if (shortArr[k - longLen - 1] >= longArr[longLen - 1]) { return shortArr[k - longLen - 1]; } if (longArr[k - shortLen - 1] >= shortArr[shortLen - 1]) { return longArr[k - shortLen - 1]; } return getUpMedianOfTwoSortedEqualLenArrays(shortArr, k - longLen, shortLen - 1, longArr, k - shortLen, longLen - 1); } private int getUpMedianOfTwoSortedEqualLenArrays(int[] arr1, int s1, int e1, int[] arr2, int s2, int e2) { if (arr1 == null || arr2 == null) { throw new RuntimeException("Invalid Input Arrays"); } if (s1 < 0 || e1 >= arr1.length || s1 > e1 s2 < 0 || e2 >= arr2.length || s2 > e2) { throw new RuntimeException("Invalid input start end"); } if (e1 - s1 != e2 - s2){ throw new RuntimeException("Length not equal"); } while (s1 < e1) { int mid1 = s1 + ((e1 - s1) >> 1); int mid2 = s2 + ((e2 - s2) >> 1); int offset = ((e1 - s1 + 1) & 1) ^ 1; if (arr1[mid1] == arr2[mid2]) { return arr1[mid1]; } else if (arr1[mid1] > arr2[mid2]) { e1 = mid1; s2 = mid2 + offset; } else { //arr1[mid1] < arr2[mid2] s1 = mid1 + offset; e2 = mid2; } } return Math.min(arr1[s1], arr2[s2]); }
全部评论
(30) 回帖