為什么要重視演算法
面試畢竟歷程- 其實這是個偽命題,如果為了面試,大家去背一下特定的幾個演算法答案就好了
- 提高邏輯思維,理解能力
- 提高代碼質量
為什么說演算法是程式員最應該學習的技能,沒有之一
為什么這么說呢?可以思考一下
學框架其實就是學怎么更好的用人家封裝好的api
看原始碼,就是看人家怎么實作的這個組件,學習人家的設計思維,
但真的是這樣嗎?但其實大多數情況都是為了應付面試,然后實際學習場景大家都是看看別人的博客,看看講解視頻,然后隨便扒扒原始碼
綜上所述其實,無論學習新框架還是看原始碼,更多的考驗的是記憶力,與略微的理解能力
思考一下,為什么面試都要考演算法?
其實我們都在逃避,相比于演算法,其他的能力確實相對于來說比較容易掌握
- 程式員更重要的就是邏輯能力,服務端更甚
-
優秀的軟體工程師必須具備過硬的代碼開發能力,而這就體現在你對資料結構、演算法思維、代碼效率優化等知識的儲備上,并直接反應在你作業中解決實際問題的好壞上,
能力分布表
| 邏輯能力 | 理解能力 | 記憶力 | |
|---|---|---|---|
| 演算法 | 60% | 30% | 10% |
| 新框架,新知識 | 10% | 20% | 70% |
| 原始碼探索 | 20% | 30% | 50% |
為什么說演算法會提高代碼質量
舉個簡單的例子
在海量資料中查詢指定資料,粗笨的方法就是回圈便利一邊找到對應的就好了,
如何用演算法來解決?
- 有序存盤
- 二分查找
收益:資料量小的時候可能沒什么明顯收益,但假如我們資料量達到了1000w,兩種查找方法的效率可能就是1000萬次和24次的區別了(log2 10000000 = 23.25)
代碼質量如何一步步提高
- 暴力解法
- 在沒有任何時間、空間約束下,完成代碼任務的開發,
- 剔除無效操作處理
- 將代碼中的無效計算、無效存盤剔除,降低時間或空間復雜度,
- 時空轉換
- 設計合理資料結構,完成時間復雜度向空間復雜度的轉移,
- 邏輯歸納
- 利用邏輯關系,完成時間復雜度和空間復雜度的降低
eg1:
假設有任意多張面額為 2 元、3 元、7 元的貨幣,現要用它們湊出 100 元,求總共有多少種可能性
暴力解法
public void s1_1() { int count = 0; for (int i = 0; i <= (100 / 7); i++) { for (int j = 0; j <= (100 / 3); j++) { for (int k = 0; k <= (100 / 2); k++) { if (i * 7 + j * 3 + k * 2 == 100) { count += 1; } } } } System.out.println(count); }
3 層的 for 回圈,從結構上來看,顯然的 O( n3 ) 的時間復雜度,思考一下會發現,最內層的 for 是多余的剔除無效操作處理
public void s1_2() { int count = 0; for (int i = 0; i <= (100 / 7); i++) { for (int j = 0; j <= (100 / 3); j++) { if ((100-i*7-j*3 >= 0)&&((100-i*7-j*3) % 2 == 0)) { count += 1; } } } System.out.println(count); }
eg2:
給定一個整數陣列 nums 和一個整數目標值 target,請你在該陣列中找出 和為目標值 的那 兩個 整數,并回傳它們的陣列下標,
暴力解法
public int[] s2_1(int[] nums, int target) { int n = nums.length; for (int i = 0; i < n; ++i) { for (int j = i + 1; j < n; ++j) { if (nums[i] + nums[j] == target) { return new int[]{i, j}; } } } return new int[0]; }
時空轉換
public int[] s2_2(int[] nums, int target) { Map<Integer, Integer> hashtable = new HashMap<Integer, Integer>(); for (int i = 0; i < nums.length; ++i) { if (hashtable.containsKey(target - nums[i])) { return new int[]{hashtable.get(target - nums[i]), i}; } hashtable.put(nums[i], i); } return new int[0]; }
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/280514.html
標籤:其他
上一篇:面試是在結善緣
下一篇:第七周結
