对LeetCode刷过的题目进行整理总结,方便后期查阅复习。
本文将LeetCode刷过的题目进行简单的总结和记录,便于自己进行复习,同时将看到的解题思路进行汇总让其他的小伙伴能够理解。
1.宝石与石头
宝石与石头:
给定字符串J 代表石头中宝石的类型,和字符串 S代表你拥有的石头。 S 中每个字符代表了一种你拥有的石头的类型,你想知道你拥有的石头中有多少是宝石。
J 中的字母不重复,J 和 S中的所有字符都是字母。字母区分大小写,因此”a”和”A”是不同类型的石头。
1 | |
注意:
S 和 J 最多含有50个字母。
J 中的字符不重复。
答案一:
分析:最笨的方法肯定是双层遍历。
1 | |
答案二:
通过题解得到了另一种思路就是将J进行循环遍历然后将S中的匹配值全部替换为空,这样长度的差值就是宝石的数量
1 | |
2.IP地址无效化
IP地址无效化:
给你一个有效的 IPv4 地址 address,返回这个 IP 地址的无效化版本。
所谓无效化 IP 地址,其实就是用 “[.]” 代替了每个 “.”。
1 | |
答案一
分析:最简单直接的方案就是正则表达式替换
1 | |
3.删除链表中的节点
删除链表中的节点:
请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点。
现有一个链表 – head = [4,5,1,9],它可以表示为:
1 | |
说明:
- 链表至少包含两个节点。
- 链表中所有节点的值都是唯一的。
- 给定的节点为非末尾节点并且一定是链表中的一个有效节点。
- 不要从你的函数中返回任何结果。
答案一
分析:说实话这道题目对于前端的同学来说其实很难理解。但是对于后台同学这个就太简单了,首先要理解单向链表的概念。对于本题只需要将删除后的节点指向新节点
1 | |
答案二
对于使用javascript的版本需要首先定义一个单向链表
1 | |
4.查找重复的电子邮箱
查找重复的电子邮箱: 编写一个 SQL 查询,查找 Person 表中所有重复的电子邮箱。
1 | |
答案一
1 | |
答案二
1 | |
5.大的国家
大的国家:这里有张 World 表
1 | |
如果一个国家的面积超过300万平方公里,或者人口超过2500万,那么这个国家就是大国家。
编写一个SQL查询,输出表中所有大国家的名称、人口和面积。
例如,根据上表,我们应该输出:
1 | |
答案一
1 | |
6.二叉搜索树的范围和
二叉搜索树的范围和: 给定二叉搜索树的根结点 root,返回 L 和 R(含)之间的所有结点的值的和。
二叉搜索树保证具有唯一的值。
1 | |
提示
- 树中的结点数量最多为 10000 个。
- 最终的答案保证小于 2^31。
答案一
Java官方解法
要理解这道题首先要知道一个概念二叉查找树, 也称为二叉搜索树、有序二叉树、排序二叉树,指一棵空树或具有以下性质的二叉树:
- 若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值;
- 若任意节点的右子树不空,则右子树上所有节点的值均大于它的根节点的值;
- 任意节点的左、右子树也分别为二叉查找树;
- 没有键值相等的节点。
深度优先搜索我们对树进行深度优先搜索,对于当前节点 node,如果 node.val 小于等于 L,那么只需要继续搜索它的右子树;如果 node.val 大于等于 R,那么只需要继续搜索它的左子树;如果 node.val 在区间 (L, R) 中,则需要搜索它的所有子树。
1 | |
1 | |
答案二
JavaScript画图解题
假设L= 7,R=15
- 如果node.val >= 7 && node.val <= 15 则直接求和
- 如果node.val > 7,则node.right的值都大于7,右侧没有搜索必要,去查找left的值
- 如果node.val < 15,则node.left的值都小于15,左侧没有搜索必要,去查找right的值
1 | |
7.转换成小写字母
转换成小写字母:实现函数 ToLowerCase(),该函数接收一个字符串参数 str,并将该字符串中的大写字母转换成小写字母,之后返回新的字符串。
1 | |
答案一
分析通过字符串的 charCodeAt和String.fromCharCode这两个方法来得到答案
1 | |
8.唯一摩尔斯密码词
唯一摩尔斯密码词
国际摩尔斯密码定义一种标准编码方式,将每个字母对应于一个由一系列点和短线组成的字符串, 比如: “a” 对应 “.-“, “b” 对应 “-…”, “c” 对应 “-.-.”, 等等。
为了方便,所有26个英文字母对应摩尔斯密码表如下:
[“.-“,”-…”,”-.-.”,”-..”,”.”,”..-.”,”–.”,”….”,”..”,”.—“,”-.-“,”.-..”,”–”,”-.”,”—“,”.–.”,”–.-“,”.-.”,”…”,”-“,”..-“,”…-“,”.–”,”-..-“,”-.–”,”–..”]
给定一个单词列表,每个单词可以写成每个字母对应摩尔斯密码的组合。例如,”cab” 可以写成 “-.-..–…”,(即 “-.-.” + “-…” + “.-“字符串的结合)。我们将这样一个连接过程称作单词翻译。
返回我们可以获得所有词不同单词翻译的数量。
1 | |
注意:
- 单词列表words 的长度不会超过 100。
- 每个单词 words[i]的长度范围为 [1, 12]。
- 每个单词 words[i]只包含小写字母。
答案一
1 | |
答案二
Java利用Set自动去重
1 | |
9.合并二叉树
合并二叉树:给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。
你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。
1 | |
答案一
Java解法
1 | |
答案二
JavaScript解法
1 | |
10.翻转图像
翻转图像给定一个二进制矩阵 A,我们想先水平翻转图像,然后反转图像并返回结果。
水平翻转图片就是将图片的每一行都进行翻转,即逆序。例如,水平翻转 [1, 1, 0] 的结果是 [0, 1, 1]。
反转图片的意思是图片中的 0 全部被 1 替换, 1 全部被 0 替换。例如,反转 [0, 1, 1] 的结果是 [1, 0, 0]。
1 | |
答案一
分析:最简单的方法就是按部就班来实现,先进行水平再进行图片反转。
对于1和0的翻转有两种方式
- 1 - 当前值 得到的是1和0的翻转
- 1 ^ 当前值 得到的也是0和1的反转。这个符号是异或,相同为0,相异为1
1 | |
答案二
数组api一行解法
1 | |
答案三
双向指针
1 | |