想蛻變,就必須翻過算法這座山

大家好,我是你們的躍哥。平時躍哥在和大家溝通交流的時候,時不時地會被問到,躍哥,算法在工作中到底用不用得到啊?算法真的很重要麼?


這。。。平時的工作中,算法不一定能用到;但是如果你能在工作中用到算法,那麼你的工作就會變得更有意義,甚至是會讓你的程序有很大的提升。


今天躍哥就推薦大家看看,一個小夥伴寫的真實感想。

寫在前面

進入編程行業四年有餘了,如果你要是問我,對什麼領域的知識最陌生呢。首先排在我腦海裏面第一位的就是算法了。

算法其實我內心一直有一種排斥感,我也仔細分析了這個排斥感的原因,最主要的還是腦海中對於這一塊知識的空缺。

還有一個原因就是工作中,用到的地方實在是不多。畢竟,如果工作中天天在用的東西,你不想學會都是挺難得一件事情。

但是,想要往編程的領域進階,算法就是我心中必須邁過去的一座山。不管它是存在着多少困難。

問題就在那裏,目標就在那裏,機會也在那裏。不逃避,不害怕。慢慢刷題。需要一道一道的去刷去學習。

算法的學習依舊是有套路可以追尋的,依舊是可以通過大量反覆練習掌握的。

算法準備

去年的時候,陸陸續續購買了兩本算法相關的書籍,一本是《我的第一本算法書》、另外一本是《labuladong的算法小抄》。

《我的第一本算法書》是使用圖解的方式解釋了一些常見的數據結構和算法。當初考慮到,一點算法的基礎也沒有。

就想着圖解的方式可以使得自己學習算法的門檻降低一些。畢竟一上來就是困難模式,也害怕把自己的信心給減退了。

這本書的作者,提到了一個對算法很接地氣的理解,他指出,算法就是計算或者解決問題的步驟。可以把它想象爲食譜。

想要做出特定美味的料理,就需要遵守食譜上面的步驟。這本書看了一半多一點,對於算法入門和掌握一些數據結構還是有些收穫的。

而《labuladong的算法小抄》這本書,一直沒怎麼細讀,僅僅是侷限在偶爾無聊的時候,翻看了大概的目錄。聽說是一個在校大學生花費了兩年的時間,一心一意整理出來的算法刷題經驗。

想想自己的大學大多時間都用來賣零食了。真的是時間花費在哪裏,收穫可能就會在哪裏。付出時間和心血是能獲取收穫的必要充分條件了。但是,不是說付出了時間就一定會有收穫的。後面還是會將這本書細細閱讀學習起來。

今天,算是自己開始正兒八經刷算法學習的首日。第一步就是在 leetcode 註冊了一個賬號。挑選了一個簡單模式的題目入門。

給定一個整數數組 nums 和一個整數目標值 target,請你在該數組中找出 和爲目標值 的那 兩個 整數,並返回它們的數組下標。

輸入:nums = [2,7,11,15], target = 9
輸出:[0,1]
解釋:因爲 nums[0] + nums[1] == 9 ,返回 [0, 1] 。

1.第一種解法:雙層 for 循環

/**
     * 力扣 暴力解法
     * 輸入:nums = [2,7,11,15], target = 9
     * 輸出:[0,1]
     * 解釋:因爲 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
     * 第一次循環 9-2 看看是不是等於7
     */

    public static int[] twoSum1(int[] nums, int target{
        //第一層循環是遍歷數組的每個元素
        for (int i = 0; i <nums.length ; i++) {
            //第二層循環是使用目標值減去比如第一個元素2看它的結果是否等於數組中其他三個元素,所以j就從i+1開始。
            for (int j = i+1; j < nums.length; j++) {
                   int processNum = target - nums[i];
                   if(processNum == nums[j]){
                      //如果相等,就返回它們對應的數組下標
                       return  new int[]{i,j};
                   }
            }
        }
        return null;

    }

2.第二種解法:使用 HashMap

/**
     * 使用 HashMap
     * 輸入:nums = [2,7,11,15], target = 9
     * 輸出:[0,1]
     * 解釋:因爲 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
     */

    public static int[] twoSum(int[] nums, int target{
        HashMap<Integer, Integer> hashMap = new HashMap<Integer, Integer>(16);
        //遍歷數組中的元素
        for (int i = 0; i < nums.length; i++) {
            //使用目標值減去數組中的元素
            int processNum = target - nums[i];
            if (hashMap.containsKey(processNum)) {
                //查看Map中是包含這個元素,包含就返回Map中這個值對應的下標與下標i
                return new int[]{hashMap.get(processNum), i};
            } else {
                ///Map中是不包含這個元素,第一次循環,就將這個數組的值nums[i]=2作爲Map的key值,i即是下標0放入到Map中
                hashMap.put(nums[i], i);

            }

        }
      return  null;
    }

第一次循環,nums[i] = 2,i 的下標等於 0,顯然,這個時候 Map 是空的,目標值 9-2 = 7,此時的 Map 中肯定是不含有 7 的。

那就將 nums[0]的值作爲 Map 的 key,數組下標 i=0 作爲 Value 存入到 HashMap 中。此時 HashMap<2,0>

第二次循環,nums[i] = 7,i 的下標等於 1。顯然,這個時候 Map 已經存在了 key 等於 2的元素。目標值 9-7 = 2,正好命中 Map 中的 key。

等同於 7 與 2 即是我們需要找尋的數組元素,返回他們的下標即可,2 對於的下標,hashMap.get(2)。7對應的下標爲 i.

3.測試 main 方法

    public static void main(String[] args{
        int[] nums = new int[]{2,7,11,15};
        int target =9;
        int[] intArray = twoSum1(nums, target);
        for (int i = 0; i < intArray.length; i++) {
            System.out.println(intArray[i]);
        }
    }

寫在後面

任何時候的開始都不爲晚,種植一棵樹最好的時間是十年前,其次是現在。算法目前就是我內心的一座山。

直面它,不想着去繞過它,也不去刻意迴避它。踏踏實實做好自己的算法刷題小練習。一步一步,朝着這座算法山脈邁過去。





0、重磅!兩萬字長文總結,梳理 Java 入門進階哪些事(推薦收藏)

1、二月,拉開牛氣沖天的一年

2、都退稅了嗎?和你聊聊發工資的騷操作。。


本文分享自微信公衆號 - 程序員小躍(runningdimple)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章