ARTS(01)

什么是ARTS?

  1. 算法(Algorithm): 每周至少一道LeetCode算法题,加强编程训练和算法学习
  2. 阅读(Review): 阅读并点评至少一篇英文技术文章,提高英文水平
  3. 技巧 (Tip):学习至少一个技术技巧,总结、归纳日常工作中遇到的知识点
  4. 分享(Share):分析一篇有关点和思考的技术文章,建立影响力,输出价值观

时间周期:

2022 年 1 月 10 日至 1 月 16 日

一:算法:

题目描述

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。

示例:
给定 nums = [2, 7, 11, 15], target = 9

因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

前置知识:

  1. 哈希表:Map - JavaScript | MDN

思路:
最容易想到的就是暴力枚举,可以利用两层for循环来遍历每个元素,并查找满足条件的目标元素。
伪代码:

for (let i = 0; i < n; i++) {
    for (let j = 0; j < i; j++) {
      if (nums[i] + nums[j] === target) {
        return [i, j]
    }
    }
}

劣势
时间复杂度为 O(N^2),空间复杂度为O(1),时间复杂度较高。

解决劣势的思路
可以增加一个Map记录已经遍历过的数字及其对应的索引值。
这样当遍历一个新数字的时候就去Map里查找目标数与该数的差值diff是否已经在前面的数字中出现过。
如果出现,说明diff + 当前数 = 目标数,我们就找到了一组答案

关键点:

  • 求和转换为求差
  • 借助Map结构将数组种的每个元素及其索引相互对应
  • 以空间换时间,将查找时间从O(N) 降低到 O(1)

代码

JavaScript实现及其拓展资料

  • Map - JavaScript | MDN
    • map.has
    • map.get
    • map.set
const demoArr = [1, 3, 5, 4]

function twoSum (numArr, target) {
  const twoSumMap = new Map()

  for (let i = 0; i < numArr.length; i++) {
    const diff = target - numArr[i]

    if (twoSumMap.has(diff)) {
      return [twoSumMap.get(diff), i]
    } else {
      twoSumMap.set(numArr[i], i)
    }
  }
}

twoSum(demoArr, 4)

Python实现及其拓展资料

  • https://docs.python.org/3/library/functions.html#enumerate
class Solution:
    def twoSum(nums, target):
        hashMap = {}
        for i,num in enumerate(nums):
            if hashMap.get(target- num) is not None:
        return [i, hashMap.get(target-num)]
        hashMap[num] = i

Java实现及其拓展资料

  • Java HashMap | 菜鸟教程
class Solution {
    public int[] twoSum(int[] nums, int target) {
        Map hashTable = new HashMap();
        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];
    }
}

Go实现及其拓展资料

  • Go 语言范围(Range) | 菜鸟教程
  • nils in Go -Go 101
func twoSum(nums []int, target int) []int {
  hashTable := map[int]int{}
  for i, x := range nums {
    if p, ok := hashTable[target - x]; ok {
      return []int{p, i}
    } else {
      hashTable[x] = i
    }
  }
  return nil
}

二:阅读,英文技术文章

My Path to Financial Independence as a Software Engineer – Software the Hard way
下面是这篇文章的四个问题

    1. 这篇文章在谈什么?
        1. 一个程序员的财务独立之路
        2. 为了在30岁的后半期实现这个目标,他从毕业到现在是如何安排自己的职业生涯的,提供了一个可行的参考
    2. 作者具体说了什么,怎么说的?
        1. 提供了一个收入和支出的表格,时间涵盖09-21年
        2. 提供了几条职场建议,具体如下
            1. 首先要努力,就是追求工资提升
                1. 普通人的收入来源,主要还是本职工作,如果你工资很低,根本不可能实现财务自由,所以必须想方设法提高工资
                2. 大厂的高级职位可以拿到稳定的高工资,所以一定要进大厂,并且做到高级工程师
            2. 每过三年,就要到处面试
                1. 3年换一家公司,这样可以显著加薪和晋升。
                2. 每次换公司,收入至少增加30%
                3. 同时让自己拥有一种进取的心态,不断处于学习和成长的环境之中。
                4. 不过,换公司是双刃剑,为了获得更高的薪酬,后面的公司会对你要求越来越高
            3. 建立良好的职业履历
                1. 要通过大厂的面试,必须有良好的职业履历
                2. 如果刚开始没有,那么去一个名校,读一个一年制硕士(欧美硕士一般都是一年),这会给你带来很多机会(前提是必须为Top5名校)
            4. 优先加入增长最快的领域
                1. 一个行业增长越快,产生的机会越多,越容易涨工资,只要自身水平够硬,也能改变专业领域
            5. 投资你的钱
                1. 有了积蓄之后,不要让钱在银行闲置,要学会投资
                2. 在投资过程中虽然会遭遇损失,但还是比放置在银行增长快的多。
            6. 节制消费
                1. 想要财务独立,一定要控制消费
                
        3. 从思路上要进行更新
            1. 同物质享受相比,财务独立才是人生最大的奢侈品。拥有了财务独立,才能不为钱的追求自己内心,做自己想做的事。
            2. 钱花在生活必需品,不要花在奢饰品(比如高档车、没用的名牌包、标,很贵的衣服)
            3. 钱不要用来享受,但可以用来增加体验。
            4. 购买房屋通常是最大的财务决定,务必要想清楚
    3. 说的有道理吗?是全部有道理,还是部分有道理?
        1. 有道理,作者提到的6条建议,我非常认同。如果能早点读到这篇文章就好了
        2. 关于买房子,还是部分有道理,当然中美环境不一样,从房子到为什么买房子的理由都不一样,只能参考他说的:务必想清楚
    4. 这篇文章跟我有什么关系?
        1. 职业上看:我本身也是程序员,这是一个可行的参考例子
        2. 年龄上看:中年将近,回顾前半生,展望后半生,发现财务自由才是我的诸多问题的解决方案,是我说服我自己的良药。

三:技巧

如何读好一本书:10 | 如何读好一本书-极客时间
    1. 要怎么做到主动阅读?
        1. 在阅读时提出问题来,同时在阅读的过程中,你必需自己尝试去回答这些问题
    2. 在主动阅读中,一个阅读者要提出四个基本问题
        1. 这本书到底在谈什么?
            1. 这本书的主题,以及作者是如何依次展开这个主题,如何逐步从核心主题分解出从属的关键议题来
            2. 一本好的书,作者往往会在书名、目录、前言等地方整理出他书中的重点
        2. 作者具体说了什么,怎么说的
            1. 除了主题外,还要找出作者主要的想法、声明和论点,这些组成了作者想要表达的特殊信息
            2. 作者通常会通过一个以上或一连串的论述和案例来讲述他为什么有这样的观点,同时也会尽量加入各种支持或反对的论点来辅助阐述
            3. 验证是否抓住核心的好方法是,看能不能用自己的话把作者的观点和想法说一遍
        3. 这本书说的有道理吗?是全部有道理,还是部分有道理?
            1. 回答这个问题之前,是在已经找到了第一·第二问题的答案。
            2. 在判断这本书是否有道理之前,必需先了解整本书在说什么
            3. 如果不赞同作者的观点,可以写书评予以反驳,但是要注意以下3点:
                1. 写的时候注意不要带有太过强烈的情绪
                2. 把自己的前提或假设先摆出阿里,没有前提条件很容易发生无谓的争论
                3. 化解因为派别之争导致的盲点,尽量做到不偏不倚
        4. 这本书跟你有什么关系?
            1. 这本书是给了我一些信息的话,一定要问问这些信息有什么意义。为什么作者认为知道这件事很重要?你真的有了解的必要吗?
            2. 如果这本书不只提供了信息,还启发了你,就更有必要找出其他相关的、更深的含义或建议,来让自己获得更多的启示
    3. 主动阅读的四个方法适用于任何一种读物,即使现在阅读的载体变了,从纸质书到电子书,到自媒体、付费课程,但是本质没有变,还是可以把这些技巧运用在任何形式的阅读上。
    4. 作者把读书分为四个渐进的层次
        1. 基础阅读,基本熟练识字就能做到
        2. 检视阅读:强调在一定时间内抓出一本书的重点
            1. 明确一本书所属的类别与基本架构,这一步基本能帮我们判别什么书翻翻就好,什么书值得精读,需要用到下一层次的分析阅读
        3. 分析阅读:强调全盘、完整的阅读,一直要读到这本书成为自己的为止。
            1. 分析阅读就是要咀嚼和消化一本书。(村上的书,我读了不止一遍,越读越好玩)
        4. 主题阅读:强调就某一主题阅读与之相关的许多本书,并形成系统化的知识。
            1. 这个一般科研人员用的比较多,对程序员来说,在深入了解、学习一个技术概念的时候,也会用到这个层次的阅读方法与技巧,比如翻阅多本书交叉阅读,比如文字+视频+代码多种维度学习。

四:分享

  1. 简单获取keycode的网站,快速将键盘输入和keycode对应起来:https://keycode.info/
  2. 如何阅读一本书,优秀的书评
    1. 如何阅读一本书 (How to Read a Book) - Leo Van | 范叶亮
    2. 读书方法分享:如何阅读一本书? - 少数派
    3. 如何在信息过载与碎片时代泰然自若——《如何阅读一本书》读书笔记 - 少数派

你可能感兴趣的:(ARTS(01))