Algorithm

本周的算法题为 49. 字母异位词分组 - 力扣(LeetCode)

给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。

字母异位词 是由重新排列源单词的所有字母得到的一个新单词。

示例 1:

输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]

实现代码如下所示:

let strs = ["eat", "tea", "tan", "ate", "nat", "bat"]

var groupAnagrams = function (strs) {
    let sortedStrs = []
    strs.forEach(str => {
        let sortedStr = str.split("").sort().join("");
        sortedStrs.push(sortedStr)
    })
    let categories = {}
    sortedStrs.forEach((str, index) => {
        if (categories[str]) {
            categories[str].push(strs[index])
        } else {
            categories[str] = [strs[index]]
        }
    })
    let result = []
    for (const key in categories) {
        result.push(categories[key])
    }
    return result
}

groupAnagrams(strs)

解题思路:

通过查看示例1的输出数组得知,相同字母但顺序可以不一样,所以我们可以考虑,将各元素重新排序,那么就可以知道哪些元素是相同的。首先,先遍历 strs 数组,使用 split("") 将字符串str分割为字符数组,然后使用 sort() 对字符数组进行排序,最后使用 join("") 将排序后的字符数组拼接为字符串。 sortedStrs 其值如下:

[ 'aet', 'aet', 'ant', 'aet', 'ant', 'abt' ]

然后开始将 sortedStrs 中的元素进行分类,将相同元素归入同一个数组中,使用对象key的唯一性进行实现,遍历 sortedStrs ,将元素作为对象 categorieskey值,如果key没有存在,则生成新的key,并将元素自身添加至value数组中,如果已存在,则将元素添加至value数组中。在以下代码中,如果 sortedStrs 中有相同的元素,则加入到 categories[str] 数组中,但是因为 sortedStrs 是排序后的数据,虽然元素被排序了,但是下标 index 是不变的,所以就 push 原数组 strs 相同下标的元素。因为如下所示:

sortedStrs.forEach((str, index) => {
    if (categories[str]) {
        categories[str].push(strs[index])
    } else {
        categories[str] = [strs[index]]
    }
})

至此,我们可以得到categories的值,如下所示:

{ 
    aet: ['eat', 'tea', 'ate'], 
    ant: ['tan', 'nat'], 
    abt: ['bat'] 
}

然后通过遍历 categories 对象,将其值加入新的数组result即可完成,如下所示:

[ [ 'eat', 'tea', 'ate' ], [ 'tan', 'nat' ], [ 'bat' ] ]

Review

Why Reading Is Part of Success | by Kevin Nokia | Medium

作者主要是说了阅读为什么可以是成功的一部分,这是因为阅读就像是和他人交流,你总能从别人身上学到一些东西。如果你平时总是很固执和虚荣,觉得自己无所不知,他人的建议置若罔闻,那么你很容易走向困境。如果你想改变这种局面,那就需要知道:

  1. 固执和虚荣会阻碍学习有价值的东西。
  2. 不要仰视任何人,不要瞧不起任何人。
  3. 尊重是学习的关键,这就是为什么我们需要倾听别人的声音。
  4. 如果你觉得听别人说话很难,那就从阅读开始吧,阅读是教你如何倾听的一个很简单的工具。
  5. 你可以从每天阅读5分钟开始。如果你还是觉得很难,你可以先读一分钟。

Tip

git clone -b ${1:-dev} 的意思是,将远程仓库的分支代码克隆至本地,如果有传参,则克隆传入的分支代码,如果没有传参,则默认克隆dev分支的代码。通常项目会有设置devteststagingmaster分支,如果想要部署不同环境时,依赖不同环境的库或项目,就会用到这个动态设置分支名称的功能。比如在install.sh文件中,有如下示例:

git clone -b ${1:-dev} https://github.com/ar7/test.git

要在.yml中调用,如下所示:

./install.sh ${BRANCH_NAME}

Share

  1. 人们不会去做你想让他们去做的事情,他们只会去做他们想去做的事情。

  2. 我觉得一个人只要认真做事,那么就值得肯定,哪怕结果不是很好,那我也会舍得花费时间和精力去协助和分担,因为做好一件事情本来就是很难的,有些事一个人就可以,有些事就需要团队的力量。大家互帮互助,才会走得更远。但是如果和我耍小心机,所作所为完全是为了自己,任务难点就推给别人,一有问题就先甩锅,那么太让我生气了。以前心态还会爆炸,就在想为什么会有这种人,但也只是生闷气,后来想明白了,我只需要多为厚道、认真做事的同事服务,为他们争取更多的利益,偷奸耍滑的睁一只眼闭一只眼就可以了,没必要去指责,用其所长即可。大家都是打工的,爱咋地咋地,只需要重点关注团队核心三四个人,还有剩下认真做事的人就行,其他不值得浪费任何时间。