Skip to content

Commit 48d4af1

Browse files
committed
字节面试准备 题解回顾
1 parent da4b16b commit 48d4af1

File tree

4 files changed

+154
-1
lines changed

4 files changed

+154
-1
lines changed

README.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,7 @@ leetcode解题的源码,解题思路在代码的注释里。
55
## python@leetcode官方专题
66
> 记录刷官方专题的题目
77
- [递归专题](/python@leetcode官方递归专题.md)
8-
- [数组专题](python@leetcode官方数组专题.md)
8+
- [数组专题](python@leetcode官方数组专题.md)
9+
10+
## 题解专题
11+
# 2021/01/25
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
2+
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
3+
4+
# 根据官方给的题解给出两种解法
5+
可在 twoSum中切换解题方式
6+
## 暴力法
7+
- 遍历每个元素 x,并查找是否存在一个值与 target−x相等的目标元素,如果采用传统的两遍遍历,时间复杂度:O(n^2)空间复杂度:O(1):
8+
-
9+
```
10+
for i in range(len(nums)):
11+
for j in range(i+1,len(nums)):
12+
if target == nums[i] + nums[j]:
13+
return [i,j]
14+
```
15+
16+
- 推荐-采用切片:
17+
当第二次遍历的时候,我们可以采用python的切片list[x:y]来重组第i个数据及其以后的数据
18+
再通过判断if (target - nums[i]) in nums[i:]来解答
19+
- 执行用时 :820 ms, 在所有 python3 提交中击败了38.74%的用户
20+
- 内存消耗 :13.7 MB, 在所有 python3 提交中击败了82.25%的用户
21+
22+
```
23+
n=0
24+
for i in range(0,len(nums)-1):
25+
n+=1
26+
if (target - nums[i]) in nums[i+1:]:
27+
return [i,nums[i+1:].index(target - nums[i])+n]
28+
```
29+
30+
31+
## 哈希表法
32+
> 通过以空间换取速度的方式,我们可以将查找时间从 O(n) 降低到 O(1)。哈希表正是为此目的而构建的,它支持以近似恒定的时间进行快速查找。
33+
34+
- 一个简单的实现使用了两次迭代。
35+
- 在第一次迭代中,我们将每个元素的值和它的索引添加到表中。
36+
- 在第二次迭代中,我们将检查每个元素所对应的目标元素(target - nums[i]target−nums[i])是否存在于表中。
37+
- 注意,该目标元素不能是 nums[i] 本身!
38+
- 时间复杂度:O(n)
39+
我们把包含有 n个元素的列表遍历两次。由于哈希表将查找时间缩短到 O(1)
40+
- 空间复杂度:O(n)
41+
所需的额外空间取决于哈希表中存储的元素数量,该表中存储了 n 个元素
42+
- 执行用时 :48 ms, 在所有 python3 提交中击败了99.71%的用户
43+
- 内存消耗 :14.2 MB, 在所有 python3 提交中击败了43.78%的用户
44+
45+
46+
```
47+
#
48+
# @lc app=leetcode.cn id=1 lang=python3
49+
#
50+
# [1] 两数之和
51+
#
52+
53+
# @lc code=start
54+
import random
55+
from typing import List
56+
class Solution:
57+
def force(self, nums: List[int], target: int) -> List[int]:
58+
print("当前使用的暴力破解的方法\n")
59+
n=0
60+
for i in range(0,len(nums)-1):
61+
# print(nums[i+1:])
62+
# print(nums[i])
63+
n+=1
64+
if (target - nums[i]) in nums[i+1:]:
65+
return [i,nums[i+1:].index(target - nums[i])+n]
66+
67+
def hash_map(self, nums: List[int], target: int) -> List[int]:
68+
print("当前使用的哈希表方法\n")
69+
hashmap={}
70+
for i,n in enumerate(nums):
71+
if target - n in hashmap:
72+
return [hashmap.get(target - n),i]
73+
hashmap[n] = i
74+
75+
76+
77+
def twoSum(self, nums: List[int], target: int) -> List[int]:
78+
# print('type',self.type)
79+
return {
80+
1 : lambda nums,target : self.force(nums,target),
81+
2 : lambda nums,target : self.hash_map(nums,target),
82+
}[1](nums,target)
83+
84+
# @lc code=end
85+
86+
if __name__ == "__main__":
87+
pass
88+
```
89+
[源码储存在github上,欢迎来提bug哦!-点击访问](https://github.com/Freen247/leetcode)
90+
[我的博客地址-点击访问](https://boywithacoin.cn/)
91+
如果觉得不错请给我一个star谢谢了Stray_Camel(^U^)ノ~YO
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
- 给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
2+
- 如果,我们将这两个数相liang加起来,则会返回一个新的链表来表示它们的和。
3+
- 您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
4+
5+
## 仿leetcode官方类ListNode定义
6+
**解决调试代码报错:**
7+
```
8+
name 'ListNode' is not defined//ListNode' object has no attribute 'val'.
9+
```
10+
> 原因:估计leetcode上面平台调试代码的时候启用了自己的一些库文件。 在本地ied调试的时候要加上ListNode的类定义(模仿官方的功能写的)。
11+
12+
13+
14+
类的代码添加:
15+
```
16+
class ListNode():
17+
def __init__(self, val):
18+
if isinstance(val,int):
19+
self.val = val
20+
self.next = None
21+
22+
elif isinstance(val,list):
23+
self.val = val[0]
24+
self.next = None
25+
cur = self
26+
for i in val[1:]:
27+
cur.next = ListNode(i)
28+
cur = cur.next
29+
30+
def gatherAttrs(self):
31+
return ", ".join("{}: {}".format(k, getattr(self, k)) for k in self.__dict__.keys())
32+
33+
def __str__(self):
34+
return self.__class__.__name__+" {"+"{}".format(self.gatherAttrs())+"}"
35+
36+
```
37+
不过就算我们定义了这个类,在本地调试的过程中,我们传参的形式还是list。但是在leetcode提交代码并不是,而是应该官方通过接口将我们传入的[1,2,3]list形式参数转化成了ListNode了。
38+
所以我们还要在本地测试之前添加判断参数形式的代码
39+
40+
```
41+
if isinstance(l1,list):
42+
l1 = ListNode(l1)
43+
l2 = ListNode(l2)
44+
```
45+
46+
47+
我们来看看vscode调试打印的效果:
48+
```
49+
if __name__ == "__main__":
50+
test = Solution()
51+
print(test.addTwoNumbers([1,3],[2,1,3]))
52+
```
53+
调试结果:(和官方定义得那个输出是一样的)
54+
```
55+
f:/Leetcode/2.两数相加.py
56+
ListNode {val: 3, next: ListNode {val: 4, next: ListNode {val: 3, next: None}}}
57+
```
58+
[源码储存在github上,欢迎来提bug哦!-点击访问](https://github.com/Freen247/leetcode)
59+
如果觉得不错请给我一个star谢谢了Stray_Camel(^U^)ノ~YO

user.out

Whitespace-only changes.

0 commit comments

Comments
 (0)