想蜕变,就必须翻过算法这座山

大家好,我是你们的跃哥。平时跃哥在和大家沟通交流的时候,时不时地会被问到,跃哥,算法在工作中到底用不用得到啊?算法真的很重要么?


这。。。平时的工作中,算法不一定能用到;但是如果你能在工作中用到算法,那么你的工作就会变得更有意义,甚至是会让你的程序有很大的提升。


今天跃哥就推荐大家看看,一个小伙伴写的真实感想。

写在前面

进入编程行业四年有余了,如果你要是问我,对什么领域的知识最陌生呢。首先排在我脑海里面第一位的就是算法了。

算法其实我内心一直有一种排斥感,我也仔细分析了这个排斥感的原因,最主要的还是脑海中对于这一块知识的空缺。

还有一个原因就是工作中,用到的地方实在是不多。毕竟,如果工作中天天在用的东西,你不想学会都是挺难得一件事情。

但是,想要往编程的领域进阶,算法就是我心中必须迈过去的一座山。不管它是存在着多少困难。

问题就在那里,目标就在那里,机会也在那里。不逃避,不害怕。慢慢刷题。需要一道一道的去刷去学习。

算法的学习依旧是有套路可以追寻的,依旧是可以通过大量反复练习掌握的。

算法准备

去年的时候,陆陆续续购买了两本算法相关的书籍,一本是《我的第一本算法书》、另外一本是《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源创计划”,欢迎正在阅读的你也加入,一起分享。

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