Skip to content

Commit cf13a87

Browse files
author
陈世伟
committed
feat: 字符串
1 parent 5bc7e55 commit cf13a87

File tree

22 files changed

+649
-151
lines changed

22 files changed

+649
-151
lines changed
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package _50_逆波兰表达式求值
2+
3+
import (
4+
"strconv"
5+
)
6+
7+
func evalRPN(tokens []string) int {
8+
l := len(tokens)
9+
var stack []int
10+
for i := 0; i < l; i++ {
11+
switch tokens[i] {
12+
case "+":
13+
if len(stack) >= 2 {
14+
num1, num2 := stack[len(stack)-2], stack[len(stack)-1]
15+
stack = stack[:len(stack)-2]
16+
stack = append(stack, num1+num2)
17+
}
18+
case "-":
19+
if len(stack) >= 2 {
20+
num1, num2 := stack[len(stack)-2], stack[len(stack)-1]
21+
stack = stack[:len(stack)-2]
22+
stack = append(stack, num1-num2)
23+
}
24+
case "*":
25+
if len(stack) >= 2 {
26+
num1, num2 := stack[len(stack)-2], stack[len(stack)-1]
27+
stack = stack[:len(stack)-2]
28+
stack = append(stack, num1*num2)
29+
}
30+
case "/":
31+
if len(stack) >= 2 {
32+
num1, num2 := stack[len(stack)-2], stack[len(stack)-1]
33+
stack = stack[:len(stack)-2]
34+
stack = append(stack, num1/num2)
35+
}
36+
default:
37+
n, _ := strconv.Atoi(tokens[i])
38+
stack = append(stack, n)
39+
}
40+
}
41+
42+
if len(stack) > 0 {
43+
result := stack[0]
44+
stack = stack[1:]
45+
return result
46+
}
47+
48+
return -1
49+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package _50_逆波兰表达式求值
2+
3+
import "testing"
4+
5+
func Test_evalRPN(t *testing.T) {
6+
type args struct {
7+
tokens []string
8+
}
9+
tests := []struct {
10+
name string
11+
args args
12+
want int
13+
}{
14+
{name: `tokens = ["2","1","+","3","*"] 9`, args: args{tokens: []string{"2", "1", "+", "3", "*"}}, want: 9},
15+
{name: `tokens = ["4","13","5","/","+"] 6`, args: args{tokens: []string{"4", "13", "5", "/", "+"}}, want: 6},
16+
{name: `tokens = ["10","6","9","3","+","-11","*","/","*","17","+","5","+"] 22`, args: args{tokens: []string{"10", "6", "9", "3", "+", "-11", "*", "/", "*", "17", "+", "5", "+"}}, want: 22},
17+
}
18+
for _, tt := range tests {
19+
t.Run(tt.name, func(t *testing.T) {
20+
if got := evalRPN(tt.args.tokens); got != tt.want {
21+
t.Errorf("evalRPN() = %v, want %v", got, tt.want)
22+
}
23+
})
24+
}
25+
}
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
package _39_滑动窗口最大值
2+
3+
import (
4+
"fmt"
5+
"github.com/chen-shiwei/leetcode/leetcode/datastruct"
6+
)
7+
8+
type MyQueue struct {
9+
dq *datastruct.Deque
10+
}
11+
12+
func NewMyQueue() *MyQueue {
13+
return &MyQueue{dq: datastruct.NewDeque()}
14+
}
15+
16+
func (m *MyQueue) Push(x int) {
17+
for !m.dq.Empty() && x > m.dq.Back() {
18+
m.dq.PopBack()
19+
}
20+
m.dq.PushBack(x)
21+
}
22+
23+
func (m *MyQueue) Pop(x int) {
24+
if !m.dq.Empty() && x == m.dq.Front() {
25+
fmt.Println("pop", m.dq.PopFront())
26+
}
27+
}
28+
29+
func (m *MyQueue) Front() int {
30+
return m.dq.Front()
31+
}
32+
33+
func maxSlidingWindow(nums []int, k int) []int {
34+
l := len(nums)
35+
//var q []int
36+
37+
qu := NewMyQueue()
38+
39+
//push := func(x int) {
40+
// if len(q) != 0 && x > q[len(q)-1] {
41+
// q = q[:len(q)-1]
42+
// }
43+
// q = append(q, x)
44+
//}
45+
//
46+
//pop := func(x int) {
47+
// if len(q) != 0 && q[0] == x {
48+
// q = q[1:]
49+
// }
50+
//}
51+
52+
var result []int
53+
for i := 0; i < k; i++ {
54+
qu.Push(nums[i])
55+
}
56+
57+
qu.dq.Println()
58+
//result = append(result, q[0])
59+
result = append(result, qu.Front())
60+
for i := k; i < l; i++ {
61+
qu.Pop(nums[i-k])
62+
qu.Push(nums[i])
63+
qu.dq.Println()
64+
result = append(result, qu.Front())
65+
//result = append(result, q[0])
66+
}
67+
return result
68+
}
69+
70+
func maxSlidingWindow1(nums []int, k int) []int {
71+
l := len(nums)
72+
var q []int
73+
74+
push := func(x int) {
75+
for len(q) != 0 && x > q[len(q)-1] {
76+
q = q[:len(q)-1]
77+
}
78+
q = append(q, x)
79+
}
80+
81+
pop := func(x int) {
82+
if len(q) != 0 && q[0] == x {
83+
fmt.Println("pop", q[0])
84+
q = q[1:]
85+
}
86+
}
87+
88+
var result []int
89+
for i := 0; i < k; i++ {
90+
push(nums[i])
91+
}
92+
93+
result = append(result, q[0])
94+
for i := k; i < l; i++ {
95+
pop(nums[i-k])
96+
push(nums[i])
97+
result = append(result, q[0])
98+
}
99+
return result
100+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package _39_滑动窗口最大值
2+
3+
import (
4+
"reflect"
5+
"testing"
6+
)
7+
8+
func Test_maxSlidingWindow(t *testing.T) {
9+
type args struct {
10+
nums []int
11+
k int
12+
}
13+
tests := []struct {
14+
name string
15+
args args
16+
want []int
17+
}{
18+
{name: `输入:nums = [1,3,-1,-3,5,3,6,7], k = 3
19+
输出:[3,3,5,5,6,7]`, args: args{
20+
nums: []int{1, 3, -1, -3, 5, 3, 6, 7},
21+
k: 3,
22+
}, want: []int{3, 3, 5, 5, 6, 7}},
23+
}
24+
for _, tt := range tests {
25+
t.Run(tt.name, func(t *testing.T) {
26+
if got := maxSlidingWindow1(tt.args.nums, tt.args.k); !reflect.DeepEqual(got, tt.want) {
27+
t.Errorf("maxSlidingWindow1() = %v, want %v", got, tt.want)
28+
}
29+
})
30+
}
31+
}

leetcode/25.K 个一组翻转链表/reverseKGroup.go

Lines changed: 28 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -14,26 +14,36 @@ type ListNode struct {
1414
}
1515

1616
func reverseKGroup(head *ListNode, k int) *ListNode {
17-
var n = head
18-
19-
var stack []int
20-
21-
var c = k
22-
for cur := head; cur != nil; cur = cur.Next {
23-
24-
if c == 0 {
25-
var l = &ListNode{}
26-
for _, v := range stack {
27-
l.Val = v
28-
l.Next = &ListNode{}
17+
hair := &ListNode{Next: head}
18+
pre := hair
19+
20+
for head != nil {
21+
tail := pre
22+
for i := 0; i < k; i++ {
23+
tail = tail.Next
24+
if tail == nil {
25+
return hair.Next
2926
}
30-
stack = stack[:0]
31-
c = k
32-
} else {
33-
stack = append([]int{cur.Val}, stack...)
34-
c--
35-
}
3627

28+
}
29+
tmp := tail.Next
30+
head, tail = reverseLinkedList(head, tail)
31+
pre.Next = head
32+
tail.Next = tmp
33+
pre = tail
34+
head = tail.Next
3735
}
3836

37+
return hair.Next
38+
}
39+
40+
func reverseLinkedList(head, tail *ListNode) (*ListNode, *ListNode) {
41+
var pre, cur = tail.Next, head
42+
for cur != nil {
43+
tmp := cur.Next
44+
cur.Next = pre
45+
pre = cur
46+
cur = tmp
47+
}
48+
return tail, head
3949
}

leetcode/28.实现strStr/strStr.go

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package _8_实现strStr
2+
3+
import "fmt"
4+
5+
func strStr(haystack string, needle string) int {
6+
l1 := len(haystack)
7+
l2 := len(needle)
8+
9+
for i := 0; i < l1-l2+1; i++ {
10+
var s2 int
11+
for j := 0; j < l2; j++ {
12+
if haystack[i+j] != needle[j] {
13+
continue
14+
}
15+
s2++
16+
}
17+
18+
if s2 == l2 {
19+
return i
20+
}
21+
}
22+
return -1
23+
}
24+
25+
func strStrWithKMP(haystack string, needle string) int {
26+
l1 := len(haystack)
27+
l2 := len(needle)
28+
29+
next := make([]int, l2)
30+
for i, j := 1, 0; i < l2; i++ {
31+
for j > 0 && needle[i] != needle[j] {
32+
j = next[j-1]
33+
}
34+
if needle[i] == needle[j] {
35+
j++
36+
}
37+
next[i] = j
38+
}
39+
fmt.Println(next)
40+
for i, j := 0, 0; i < l1; i++ {
41+
for j > 0 && haystack[i] != needle[j] {
42+
j = next[j-1]
43+
}
44+
if haystack[i] == needle[j] {
45+
j++
46+
}
47+
if j == l2 {
48+
return i - l2 + 1
49+
}
50+
}
51+
return -1
52+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package _8_实现strStr
2+
3+
import "testing"
4+
5+
func Test_strStr(t *testing.T) {
6+
type args struct {
7+
haystack string
8+
needle string
9+
}
10+
tests := []struct {
11+
name string
12+
args args
13+
want int
14+
}{
15+
{name: `输入:haystack = "hello", needle = "ll"
16+
输出:2`, args: args{
17+
haystack: "hello",
18+
needle: "ll",
19+
}, want: 2},
20+
{name: `输入:haystack = "aabaabaafa", needle = "aabaaf"
21+
输出:2`, args: args{
22+
haystack: "aabaabaafa",
23+
needle: "aabaaf",
24+
}, want: 3},
25+
}
26+
for _, tt := range tests {
27+
//t.Run(tt.name, func(t *testing.T) {
28+
// if got := strStr(tt.args.haystack, tt.args.needle); got != tt.want {
29+
// t.Errorf("strStr() = %v, want %v", got, tt.want)
30+
// }
31+
//})
32+
t.Run(tt.name, func(t *testing.T) {
33+
if got := strStrWithKMP(tt.args.haystack, tt.args.needle); got != tt.want {
34+
t.Errorf("strStrWithKMP() = %v, want %v", got, tt.want)
35+
}
36+
})
37+
}
38+
39+
}

leetcode/347.前K个高频元素/topkfrequent.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
package _47_前K个高频元素
22

3+
import (
4+
"container/heap"
5+
"github.com/chen-shiwei/leetcode/leetcode/datastruct"
6+
)
7+
38
func topKFrequent(nums []int, k int) []int {
49
var dict = make(map[int]int)
510

@@ -43,3 +48,26 @@ func QSort(nums [][]int) {
4348
QSort(nums[left+1:])
4449

4550
}
51+
52+
func topKFrequentWithIHeap(nums []int, k int) []int {
53+
dict := map[int]int{}
54+
for _, v := range nums {
55+
dict[v]++
56+
}
57+
58+
h := &datastruct.IHeap{}
59+
heap.Init(h)
60+
for i, v := range dict {
61+
heap.Push(h, [2]int{i, v})
62+
if h.Len() > k {
63+
heap.Pop(h)
64+
}
65+
}
66+
67+
result := make([]int, k)
68+
for i := 0; i < k; i++ {
69+
result[k-i-1] = heap.Pop(h).([2]int)[0]
70+
}
71+
72+
return result
73+
}

0 commit comments

Comments
 (0)