欢迎来到我的小小世界

Change is a million times less painful than regret

0%

  天有不测风云,人有旦夕祸福。蜈蚣百足,行不及蛇;雄鸡两翼,飞不过鸦。马有千里之程,无骑不能自往;人有冲天之志,非运不能自通。
  盖闻:人生在世,富贵不能淫,贫贱不能移。文章盖世,孔子厄于陈邦;武略超群,太公钓于渭水。颜渊命短,殊非凶恶之徒;盗跖年长,岂是善良之辈。尧帝明圣,却生不肖之儿;瞽叟愚顽,反生大孝之子。张良原是布衣,萧何曾为县吏。晏子身无五尺,封作齐国宰相;孔明卧居草庐,能作蜀汉军师。楚霸虽雄,败于乌江自刎;汉王虽弱,竟有万里江山。李广有射虎之威,到老无封;冯唐有乘龙之才,一生不遇。韩信未遇之时,无一日三餐,及至遇行,腰悬三齐玉印,一旦时衰,死于阴人之手。
  有先贫而后富,有老壮而少衰。满腹文章,白发竟然不中;才疏学浅,少年及第登科。深院宫娥,运退反为妓妾;风流妓女,时来配作夫人。
  青春美女,却招愚蠢之夫;俊秀郎君,反配粗丑之妇。蛟龙未遇,潜水于鱼鳖之间;君子失时,拱手于小人之下。衣服虽破,常存仪礼之容;面带忧愁,每抱怀安之量。时遭不遇,只宜安贫守份;心若不欺,必然扬眉吐气。初贫君子,天然骨骼生成;乍富小人,不脱贫寒肌体。
  天不得时,日月无光;地不得时,草木不生;水不得时,风浪不平;人不得时,利运不通。注福注禄,命里已安排定,富贵谁不欲?人若不依根基八字,岂能为卿为相?
  余者,居洛阳之时,朝投僧寺,夜宿破窑。布衣不能遮其体,饘粥不能充其饥。上人嫌,下人憎,皆言余之贱也,余曰:非贱也,乃时也,运也,命也。余后登高及第,入中书,官至极品,位列三公,思衣则有绮罗千箱,思食则有百味珍馐,有挞百僚之杖,有斩佞臣之剑,出则壮士执鞭,入则佳人扶袂,廪有余粟,库有余财,人皆言余之贵也,余曰:非贵也,乃时也,运也,命也。
  嗟呼!人生在世,富贵不可尽用,贫贱不可自欺,听由天地循环,周而复始焉。

阅读全文 »

题目地址160. 相交链表

https://leetcode-cn.com/problems/intersection-of-two-linked-lists/

题目描述

给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。

图示两个链表在节点 c1 开始相交:

题目数据 保证 整个链式结构中不存在环。

注意,函数返回结果后,链表必须 保持其原始结构 。

 

示例 1:

阅读全文 »

题目地址

https://leetcode-cn.com/problems/reverse-string/

题目描述

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。

不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。

 

示例 1:

输入:s = ["h","e","l","l","o"]
输出:["o","l","l","e","h"]
示例 2:

输入:s = ["H","a","n","n","a","h"]
输出:["h","a","n","n","a","H"]
 

提示:

1 <= s.length <= 105
s[i] 都是 ASCII 码表中的可打印字符

前置知识

  • 双指针 两端指针

公司

  • 暂无

思路

简单的双指针中的两端指针,两个指针指向的元素相互对调

阅读全文 »

题目地址(19. 删除链表的倒数第 N 个结点  labuladong 题解)

https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list/

题目描述

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。

进阶:你能尝试使用一趟扫描实现吗?

 

示例 1:


输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]
示例 2:

输入:head = [1], n = 1
输出:[]
示例 3:

输入:head = [1,2], n = 1
输出:[1]
 

提示:

链表中结点的数目为 sz
1 <= sz <= 30
0 <= Node.val <= 100
1 <= n <= sz

前置知识

  • 双指针 快慢指针

公司

  • facebook 微软

思路

思路来源
这道题使用的是双指针中的快慢指针,采用快慢指针中的主要想法为求中点的部分,利用快慢指针步伐不一致的特点求解答案。
此题类似于求终点,但是更具有技巧性,三种递进式思考如下:

阅读全文 »

题目地址(125. 验证回文串)

https://leetcode-cn.com/problems/valid-palindrome/

题目描述

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。

说明:本题中,我们将空字符串定义为有效的回文串。

 

示例 1:

输入: "A man, a plan, a canal: Panama"
输出: true
解释:"amanaplanacanalpanama" 是回文串
示例 2:

输入: "race a car"
输出: false
解释:"raceacar" 不是回文串
 

提示:

1 <= s.length <= 2 * 105
字符串 s 由 ASCII 字符组成

前置知识

  • 双指针,两端指针

公司

  • facebook,google

    思路

    常规思路非常简单,一共分两步:第一步,将除大写字母,小写字母和数字提取出来,添加到一个新的字符串中;第二步,设置两端指针,两个指针指向的位置进行比较,如果不相同直接返回false,相同则向内收缩,知道两端指针相同或者反向错位。

    关键点

  • 双指针,两端指针

代码

  • 语言支持:Java
阅读全文 »

题目地址(88. 合并两个有序数组)

https://leetcode-cn.com/problems/merge-sorted-array/

题目描述

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。

请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。

注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n 。

 

示例 1:

输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3
输出:[1,2,2,3,5,6]
解释:需要合并 [1,2,3] 和 [2,5,6] 。
合并结果是 [1,2,2,3,5,6] ,其中斜体加粗标注的为 nums1 中的元素。
示例 2:

输入:nums1 = [1], m = 1, nums2 = [], n = 0
输出:[1]
解释:需要合并 [1] 和 [] 。
合并结果是 [1] 。
示例 3:

输入:nums1 = [0], m = 0, nums2 = [1], n = 1
输出:[1]
解释:需要合并的数组是 [] 和 [1] 。
合并结果是 [1] 。
注意,因为 m = 0 ,所以 nums1 中没有元素。nums1 中仅存的 0 仅仅是为了确保合并结果可以顺利存放到 nums1 中。
 

提示:

nums1.length == m + n
nums2.length == n
0 <= m, n <= 200
1 <= m + n <= 200
-109 <= nums1[i], nums2[j] <= 109
 

进阶:你可以设计实现一个时间复杂度为 O(m + n) 的算法解决此问题吗?


前置知识

  • 双指针 排序方式

公司

  • 字节,facebook,微软

思路

最简单的思路,两步:第一,将nums2的数组添加到nums1中,因为题目已经预设了nums1的长度是两个数组的长度和;第二,将nums1中的所有元素重新排序即可。总体来说,想要解答很简单

阅读全文 »

题目地址(141. 环形链表)

https://leetcode-cn.com/problems/linked-list-cycle/

题目描述

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
给定一个链表,判断链表中是否有环。

如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。

如果链表中存在环,则返回 true 。 否则,返回 false 。

 

进阶:

你能用 O(1)(即,常量)内存解决此问题吗?

 

示例 1:

输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。


示例 2:

输入:head = [1,2], pos = 0
输出:true
解释:链表中有一个环,其尾部连接到第一个节点。


示例 3:

输入:head = [1], pos = -1
输出:false
解释:链表中没有环。


 

提示:

链表中节点的数目范围是 [0, 104]
-105 <= Node.val <= 105
pos 为 -1 或者链表中的一个 有效索引 。

前置知识

  • 双指针中的快慢指针,通过快慢指针在双指针的性质来判断

公司

  • 字节跳动

思路

利用的是双指针中快慢指针在单链表中是否存在环的判断,慢指针一次一步,快指针一次两步,如果两个指针如果两个指针相遇则一定存在环,反之也成立(直接使用即可)

阅读全文 »

双指针可以分为两类,一类是「快慢指针」,一类是「左右指针」。前者解决主要解决链表中的问题,比如典型的判定链表中是否包含环;后者主要解决数组(或者字符串)中的问题,比如二分查找。

快慢指针的常用的算法

快慢指针初始阶段一般都指向头结点head,前进时快指针fast在前,慢指针slow在后,可以解决链表中的某些问题。

判断链表中是否有环

单链表的特点是每个节点只知道下一个节点,所以一个指针无法确定链表中的是否存在环。
如果链表中不含环,那个这个指针最终会遇到空指针null表示链表到头了,这可以表示链表中不存在环

1
2
3
4
5
boolean hasCycle(ListNode head) {
while (head != null)
head = head.next;
return false;
}

但是如果链表中存在环,那么这个指针就会陷入死循环,因为环形数组中无法提供用来作为结束的null指针。
经典解法就是使用两个指针,一个快指针,一个慢指针。如果不含环,快指针一定会遇到null指针,表示已经到头,证明不含环;如果含有环,快指针最终会和慢指针相遇,这就表明两边含环。

阅读全文 »

题目地址(27. 移除元素)

https://leetcode-cn.com/problems/remove-element/

题目描述

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。

不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。

元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

 

说明:

为什么返回数值是整数,但输出的答案是数组呢?

请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。

你可以想象内部操作如下:

// nums 是以“引用”方式传递的。也就是说,不对实参作任何拷贝
int len = removeElement(nums, val);

// 在函数里修改输入数组对于调用者是可见的。
// 根据你的函数返回的长度, 它会打印出数组中 该长度范围内 的所有元素。
for (int i = 0; i < len; i++) {
    print(nums[i]);
}
 

示例 1:

输入:nums = [3,2,2,3], val = 3
输出:2, nums = [2,2]
解释:函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。你不需要考虑数组中超出新长度后面的元素。例如,函数返回的新长度为 2 ,而 nums = [2,2,3,3] 或 nums = [2,2,0,0],也会被视作正确答案。
示例 2:

输入:nums = [0,1,2,2,3,0,4,2], val = 2
输出:5, nums = [0,1,4,0,3]
解释:函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。注意这五个元素可为任意顺序。你不需要考虑数组中超出新长度后面的元素。
 

提示:

0 <= nums.length <= 100
0 <= nums[i] <= 50
0 <= val <= 100

前置知识

  • 双指针
  • 两端指针

公司

  • 字节跳动 谷歌

思路

思路比较简单,使用双指针,一个用来表紧检索到的位置(left),一个用来标记可以交换的位置(right),当left遍历到非法数字(val)的时候,与right所在的合法字符串进行位置交换,因为这里题目不考虑顺序问题,所以直接交换就可以。最后输出right+1

阅读全文 »

题目地址(415. 字符串相加)

https://leetcode-cn.com/problems/add-strings/

题目描述

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和并同样以字符串形式返回。

你不能使用任何內建的用于处理大整数的库(比如 BigInteger), 也不能直接将输入的字符串转换为整数形式。

 

示例 1:

输入:num1 = "11", num2 = "123"
输出:"134"


示例 2:

输入:num1 = "456", num2 = "77"
输出:"533"


示例 3:

输入:num1 = "0", num2 = "0"
输出:"0"


 

 

提示:

1 <= num1.length, num2.length <= 104
num1 和num2 都只包含数字 0-9
num1 和num2 都不包含任何前导零

前置知识

  • StringBuilder ASCII值

公司

  • 字节跳动,百度等

思路

  • 利用ASCII码的差值变相的将char转换为int类型的参与加减
  • 进位使用除法进行统计,具体见注释
  • 由于String的不可分割性,所以使用StringBuilder进行每一步数字的添加。

    关键点

阅读全文 »