Skip to content

Commit c0531e5

Browse files
Merge pull request #32 from v1xingyue/master
BJ001-1904007-第一周算法作业-第一次提交
2 parents 3cc909b + 3290ca2 commit c0531e5

File tree

7 files changed

+442
-1
lines changed

7 files changed

+442
-1
lines changed

Week_01/id_7/LeetCode_136_7.go

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package geekcode
2+
3+
/*
4+
https://leetcode-cn.com/problems/single-number/
5+
6+
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
7+
8+
说明:
9+
10+
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
11+
12+
示例 1:
13+
14+
输入: [2,2,1]
15+
输出: 1
16+
示例 2:
17+
18+
输入: [4,1,2,1,2]
19+
输出: 4
20+
21+
22+
因为抑或满足交换律,所以, 乱序 也可以随意交换,
23+
把两个相同的放在一起,抑或为 0 ,
24+
最后剩下多余的那个数字,就是出现一次的数字
25+
*/
26+
27+
func singleNumber(nums []int) int {
28+
num := 0
29+
for _, v := range nums {
30+
num = num ^ v
31+
}
32+
return num
33+
}
34+
35+
/***
36+
func singleNumber(nums []int) int {
37+
hashnums := make(map[int]int)
38+
for k,v := range nums {
39+
if _,ok := hashnums[v] ; ok {
40+
delete(hashnums,v)
41+
}else {
42+
hashnums[v] = k
43+
}
44+
}
45+
for idx,_ := range(hashnums) {
46+
return idx
47+
}
48+
return -1
49+
}
50+
**/

Week_01/id_7/LeetCode_1_7.go

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package geekcode
2+
3+
/*
4+
https://leetcode-cn.com/problems/two-sum/
5+
6+
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
7+
8+
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
9+
10+
示例:
11+
12+
给定 nums = [2, 7, 11, 15], target = 9
13+
14+
因为 nums[0] + nums[1] = 2 + 7 = 9
15+
所以返回 [0, 1]
16+
17+
*/
18+
19+
func twoSum(nums []int, target int) []int {
20+
l := len(nums)
21+
hashNums := make(map[int]int)
22+
23+
// 如果一个数字是解,那么最多出现两次
24+
for i := 0; i < l; i++ {
25+
hashNums[nums[i]] = i
26+
}
27+
28+
for i := 0; i < l-1; i++ {
29+
30+
if idx, ok := hashNums[target-nums[i]]; ok && idx != i {
31+
return []int{i, idx}
32+
}
33+
34+
}
35+
return nil
36+
37+
}

Week_01/id_7/LeetCode_20_7.go

Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
package geekcode
2+
3+
/*
4+
https://leetcode-cn.com/problems/valid-parentheses/
5+
给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。
6+
7+
有效字符串需满足:
8+
9+
左括号必须用相同类型的右括号闭合。
10+
左括号必须以正确的顺序闭合。
11+
注意空字符串可被认为是有效字符串。
12+
13+
示例 1:
14+
15+
输入: "()"
16+
输出: true
17+
示例 2:
18+
19+
输入: "()[]{}"
20+
输出: true
21+
示例 3:
22+
23+
输入: "(]"
24+
输出: false
25+
示例 4:
26+
27+
输入: "([)]"
28+
输出: false
29+
示例 5:
30+
31+
输入: "{[]}"
32+
输出: true
33+
34+
*/
35+
36+
// 用单链表来实现一个简单的栈,
37+
// push 操作为队尾添加元素
38+
// pop 操作为从队尾获取元素,前边的元素的next 指向nil
39+
// 判断是否为空 , 判断 last 指向的元素是否为nil
40+
// 考虑到单链表操作,如果从队尾删除数据 即 pop 操作,查找pre 元素,复杂度较高,所以,采用头插法实现链表插入操作
41+
// 不要担心 last 指针为空,着急改变last 的指向,第一个节点的next 为nil 正好表示栈为空
42+
43+
//链表实现的一个栈
44+
//默认最大元素个数为2048
45+
type Node struct {
46+
val rune
47+
next *Node
48+
}
49+
50+
//栈类型
51+
type Stack struct {
52+
head *Node
53+
size int
54+
max int
55+
}
56+
57+
//初始化栈,不使用大小参数
58+
func NewStack() *Stack {
59+
s := new(Stack)
60+
s.size = 0
61+
s.max = 2048
62+
return s
63+
}
64+
65+
// 大小控制,默认可以装2048个元素,可以传递大小参数
66+
func NewStackWithSize(max int) *Stack {
67+
s := new(Stack)
68+
s.size = 0
69+
s.max = max
70+
return s
71+
}
72+
73+
//push 操作注意,头指针的next 指针变动
74+
//遍历结果,从head 指针往next 遍历即可完成操作
75+
//超过最大的size ,则入栈失败
76+
func (self *Stack) Push(c rune) bool {
77+
if self.size >= self.max {
78+
return false
79+
}
80+
self.size++
81+
self.head = &Node{val: c, next: self.head}
82+
return true
83+
}
84+
85+
//出栈操作,直接获取头指针,然后改变头指针为头指针的下一个结点
86+
func (self *Stack) Pop() rune {
87+
if self.head == nil {
88+
return 0
89+
}
90+
b := self.head.val
91+
self.head = self.head.next
92+
self.size--
93+
return b
94+
}
95+
96+
//返回当前栈内的元素个数
97+
func (self *Stack) Count() int {
98+
return self.size
99+
}
100+
101+
//检查栈是否为空
102+
func (self *Stack) IsEmpty() bool {
103+
return self.size == 0
104+
}
105+
106+
//检查括号字符串匹配
107+
func isValid(s string) bool {
108+
stack := NewStack()
109+
var last rune
110+
for _, v := range s {
111+
switch v {
112+
case '(', '[', '{':
113+
stack.Push(v)
114+
case ')':
115+
last = stack.Pop()
116+
if last != '(' {
117+
return false
118+
}
119+
case ']':
120+
last = stack.Pop()
121+
if last != '[' {
122+
return false
123+
}
124+
case '}':
125+
last = stack.Pop()
126+
if last != '{' {
127+
return false
128+
}
129+
}
130+
}
131+
return stack.IsEmpty()
132+
}

Week_01/id_7/LeetCode_21_7.go

Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
package geekcode
2+
3+
// 题目地址: https://leetcode-cn.com/problems/merge-two-sorted-lists/
4+
// 合并两个有序链表
5+
//将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
6+
//
7+
//示例:
8+
//
9+
//输入:1->2->4, 1->3->4
10+
//输出:1->1->2->3->4->4
11+
//
12+
13+
import (
14+
"log"
15+
)
16+
17+
type ListNode struct {
18+
Val int
19+
Next *ListNode
20+
}
21+
22+
/**
23+
* 打印list 类型,方便查看list的结果
24+
*/
25+
func PrintList(list *ListNode) {
26+
l := list
27+
for l != nil {
28+
log.Println(l.Val)
29+
l = l.Next
30+
}
31+
}
32+
33+
/**
34+
* 初始化列表
35+
* 使用一个数组初始化
36+
*/
37+
func InitList(nums []int) *ListNode {
38+
h := new(ListNode)
39+
l := h
40+
for _, v := range nums {
41+
l.Next = &ListNode{Val: v, Next: nil}
42+
l = l.Next
43+
}
44+
return h.Next
45+
}
46+
47+
/**
48+
* Definition for singly-linked list.
49+
* type ListNode struct {
50+
* Val int
51+
* Next *ListNode
52+
* }
53+
*
54+
8 ms, 2.8 MB,
55+
*/
56+
func mergeTwoLists(l1 *ListNode, l2 *ListNode) *ListNode {
57+
58+
if l1 == nil {
59+
return l2
60+
}
61+
62+
if l2 == nil {
63+
return l1
64+
}
65+
66+
p0, p1 := l1, l2
67+
nList := new(ListNode)
68+
p2 := nList
69+
70+
for p0 != nil || p1 != nil {
71+
switch {
72+
case p0 == nil:
73+
nList.Next = &ListNode{Val: p1.Val, Next: nil}
74+
p1 = p1.Next
75+
case p1 == nil:
76+
nList.Next = &ListNode{Val: p0.Val, Next: nil}
77+
p0 = p0.Next
78+
default:
79+
if p0.Val <= p1.Val {
80+
nList.Next = &ListNode{Val: p0.Val, Next: nil}
81+
p0 = p0.Next
82+
} else {
83+
nList.Next = &ListNode{Val: p1.Val, Next: nil}
84+
p1 = p1.Next
85+
}
86+
}
87+
88+
nList = nList.Next
89+
}
90+
return p2.Next
91+
}
92+
93+
/*
94+
* 修改版本,减少内存消耗
95+
* 4ms , 2.5 MB
96+
*/
97+
func mergeTwoLists2(l1 *ListNode, l2 *ListNode) *ListNode {
98+
99+
if l1 == nil {
100+
return l2
101+
}
102+
103+
if l2 == nil {
104+
return l1
105+
}
106+
107+
p0, p1 := l1, l2
108+
nList := new(ListNode)
109+
p2 := nList
110+
111+
for p0 != nil || p1 != nil {
112+
switch {
113+
case p0 == nil:
114+
nList.Next = p1
115+
p1 = p1.Next
116+
case p1 == nil:
117+
nList.Next = p0
118+
p0 = p0.Next
119+
default:
120+
if p0.Val <= p1.Val {
121+
nList.Next = p0
122+
p0 = p0.Next
123+
} else {
124+
nList.Next = p1
125+
p1 = p1.Next
126+
}
127+
}
128+
129+
nList = nList.Next
130+
}
131+
return p2.Next
132+
133+
}

Week_01/id_7/NOTE.md

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,25 @@
1-
# 学习笔记
1+
# 学习笔记
2+
3+
* 合并两个有序链表:
4+
5+
[https://leetcode-cn.com/problems/merge-two-sorted-lists/](https://leetcode-cn.com/problems/merge-two-sorted-lists/)
6+
7+
[merge-two-sorted-lists.go](merge-two-sorted-lists.go)
8+
9+
* 只出现一次的数字:
10+
11+
[https://leetcode-cn.com/problems/single-number/](https://leetcode-cn.com/problems/single-number/)
12+
13+
[single-number.go](single-number.go)
14+
15+
* 两数之和等于指定数字:
16+
17+
[https://leetcode-cn.com/problems/two-sum/](https://leetcode-cn.com/problems/two-sum/)
18+
19+
[two-sum.go](two-sum.go)
20+
21+
* 合法的括号:
22+
23+
[https://leetcode-cn.com/problems/valid-parentheses/](https://leetcode-cn.com/problems/valid-parentheses/)
24+
25+
[valid-parentheses.go](valid-parentheses.go)

0 commit comments

Comments
 (0)