最近參加了某廠的三輪面試,每輪面試面試官均會發送連接,進行在線編程。
題目並不要求完整實現,只要寫出大概過程,並闡述解題思路以及注意點便可。
在我極有限的面試經歷中我,委實顯得有趣。java
題目很簡單,將給定的字符串轉換成int。
拿到題目的時候我很錯愕,這基本是校招生都會以爲簡單的題目。
那麼此題惟一須要考慮的就是corner case
。c++
首先,肯定在解析失敗的狀況下,返回特定數值仍是拋出異常(最後約定返回-1)。
此外,須要考慮以下狀況:程序員
public int myAtoi(String str) { if (str == null || str.length() == 0) { return -1; } str = str.trim(); if (str.length() == 0) { return -1; } int res = 0, len = str.length(); boolean flag = false; if (str.charAt(0) == '+') { flag = true; if (len == 1) { return -1; } } else if (str.charAt(0) == '-') { if (len == 1) { return -1; } } else if (str.charAt(0) <= '9' && str.charAt(0) >= '0') { res = str.charAt(0) - '0'; } else { return -1; } for (int i = 1; i < str.length(); i++) { if (str.charAt(i) >= '0' && str.charAt(i) <= '9') { if (res > Integer.MAX_VALUE / 10) { return -1; } res = res * 10 + (str.charAt(i) - '0'); } else { return -1; } } return (!flag) ? -1 * res : res; }
關於此題,沒法理解本身的理解是否正確.
我須要一個支持高併發的插入和獲取接口,存放數據爲鏈路監控的Trace
數據.面試
關於
Trace
數據,可參考OpenTracing
相關規範。編程
代碼此處就不進行詳細展現。
具體思路就是將數據統一存放至ConcurrentHashMap
,插入和查詢較爲簡單,Trace
數據更新時須要注意加鎖。
由於數據限定存放在內存中,那麼最簡單提升併發的方式就是入參進行哈希操做,存放在若干個ConcurrentHashMap
中。數組
題目比較簡單,設計一個矩陣乘法以及相應的測試用例(概要描述便可)。緩存
public class Matrix { public int[][] plus(int[][] a, int[][] b) { // 校驗 if (a.length == 0 || a[0].length == 0 || b.length == 0 || b[0].length == 0) { throw new Exception("xx1"); } if (a.length != b[0].length || a[0].length != b.length) { throw new Exception("xx2"); } // 計算 int c[][] = new int[a.length][b[0].length]; int x, i, j; for (i = 0; i < a.length; i++) { for (j = 0; j < b[0].length; j++) { int tmp = 0; for (x = 0; x < b.length; x++) { tmp += a[i][x] * b[x][j]; // 須要處理數據溢出 } c[i][j] = tmp; } } return c; } } //test1: 傳入空數據(數組爲空) //test2:傳入不規整數據(矩陣長度不一致) //test3:傳入乘積累加後溢出的數據 //test4: 傳入矩陣維數爲1的數據 //test5: 傳入較小維度矩陣 //test6: 傳入維度巨大矩陣
代碼比較簡單,可是在面試官的提示下,漏掉了1*m矩陣和m*1矩陣相乘
的狀況。
由於面試時間有限,就沒有設計類存放矩陣數據,從而避免1*m矩陣和m*1矩陣相乘
的特例。
追加問題:微信
(1) 上述代碼,如何更改可以提高性能?數據結構
上述代碼在排除雙重循環的問題後,聯想到b
矩陣的數據是按列獲取的。
這也意味着每輪獲取b[i][j]
的數據,都沒法利用到cpu的緩存,所以能夠將乘法進行優化,儘可能按照行去讀取數據。併發
(2)高維稀疏矩陣如何進行優化呢?
僅保留不爲0的數據,此時須要設計數據結構,保存數據的三要素:行號,列號以及數值;
此外創建數組存放三元組數據,格式以下所示:
typedef struct NODE{ //定義稀疏矩陣結點 int j; //列 int data; //值 } Node; typedef struct MATRIX{ //定義稀疏矩陣(能夠快速訪問) int mu, nu, tu; // mu爲矩陣行數,nu爲矩陣列數,tu爲矩陣中非零元素的個數 Node matrix[MAXSIZE+1]; int rpos[MAXR+1]; } Matrix; // 摘抄網上代碼,當時只提出了想法
針對三元組表示的矩陣乘法,在網上有較多的示例,你們可自行查閱。
說實話,三次面試的機試題都頗有趣,題目難度不大,可是面試官會層層遞進的詢問,不斷髮掘疏忽的細節。
PS:
若是您以爲個人文章對您有幫助,請關注個人微信公衆號,謝謝!