校招時刷題誤區(qū)總結(jié)
1. AC后上傳到Github就不管了
性價比很低弟头,別人的solution不代表自己真正消化理解了,刷完不總結(jié)反思很容易遺忘发绢,以致看submissions只記得自己AC過赴涵,而思路完全記不得。以后每周/雙周/月骨宠,對最近AC的題目進行白板編程復習,溫故而知新相满,檢測標準就是做過的題目白板bug-free AC层亿。
2. 防御性編程
上來先考慮corner case有哪幾類,比如此題必然要考慮好行向量立美、列向量匿又,方陣,普通矩陣建蹄。另外碌更,挖掘出題目潛在的點,比如此題有對稱性等洞慎。
對比總結(jié)
自己的AC Solution
class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
List<Integer> result = new ArrayList<>();
if (matrix == null || matrix.length == 0) {
return result;
}
int m = matrix.length, n = matrix[0].length;
for (int k = 0; k < (Math.min(m, n) + 1) / 2; ++k) {
int j = 0;
for (j = k; j < n - k; ++j) {
result.add(matrix[k][j]);
}
for (j = k + 1; j < m - k; ++j) {
result.add(matrix[j][n - k - 1]);
}
if (m - k - 1 > k) {
for (j = n - k - 2; j >= k; --j) {
result.add(matrix[m - k - 1][j]);
}
}
if (n - k - 1 > k){
for (j = m - k - 2; j > k; --j) {
result.add(matrix[j][k]);
}
}
}
return result;
}
}
九章的Solution
class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
List<Integer> result = new ArrayList<>();
if (matrix == null || matrix.length == 0) {
return result;
}
int m = matrix.length, n = matrix[0].length;
int x = 0, y = 0;
while (m > 0 && n > 0) {
if (m == 1) {
for (int i = 0; i < n; ++i) {
result.add(matrix[x][y++]);
}
break;
} else if (n == 1) {
for (int i = 0; i < m; ++i) {
result.add(matrix[x++][y]);
}
break;
}
for (int i = 0; i < n - 1; ++i) {
result.add(matrix[x][y++]);
}
for (int i = 0; i < m - 1; ++i) {
result.add(matrix[x++][y]);
}
for (int i = 0; i < n - 1; ++i) {
result.add(matrix[x][y--]);
}
for (int i = 0; i < m - 1; ++i) {
result.add(matrix[x--][y]);
}
x++;
y++;
m = m - 2;
n = n - 2;
}
return result;
}
}
總結(jié)
雖然自己寫的AC code更短痛单,但更像是外行通過觀察規(guī)律寫出的code。九章的算法更符合計算機思維劲腿,通過記錄起始點坐標旭绒,通過
和
控制步數(shù),在面試時更容易bug-free的寫出來焦人。自己的code萬一面試時忘記一個
就直接gg了挥吵。
另外記一些鬼才/不常見的思路,在面試時是有風險的垃瞧,不是所有面試官都像Pony.ai有ACM大神坐鎮(zhèn)蔫劣,能迅速理解你的思路坪郭,大多數(shù)公司面試官都是業(yè)務線開發(fā)臨時準備个从。所以穩(wěn)妥起見,熟練掌握通用思路是第一順位。