Skip to content

Commit ac0069d

Browse files
author
limingzhong
committed
add
1 parent c137a06 commit ac0069d

File tree

6 files changed

+272
-2
lines changed

6 files changed

+272
-2
lines changed

src/linkedlist/list.go

Lines changed: 87 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package linkedlist
22

3-
import "fmt"
3+
import (
4+
"fmt"
5+
)
46

57
type ListNode struct {
68
val interface{}
@@ -96,3 +98,87 @@ func ReverseList(head *ListNode) *ListNode {
9698

9799
return pre
98100
}
101+
102+
// 反转从位置  *m*  到  *n*  的链表。请使用一趟扫描完成反转。
103+
func ReverseListMN(head *ListNode, m, n int) *ListNode {
104+
if m < 0 || m > n {
105+
return head
106+
}
107+
108+
dummy := &ListNode{}
109+
dummy.next = head
110+
111+
i := 0
112+
current := dummy
113+
// 遍历跳过
114+
nodeMPre := current
115+
for current != nil && i < m {
116+
nodeMPre = current
117+
current = current.next
118+
i++
119+
}
120+
121+
// 遍历
122+
var pre *ListNode
123+
nodeM := current
124+
for current != nil && i <= n {
125+
temp := current.next
126+
current.next = pre
127+
pre = current
128+
current = temp
129+
i++
130+
}
131+
132+
nodeMPre.next = pre
133+
nodeM.next = current
134+
135+
return dummy.next
136+
}
137+
138+
// 给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于  *x*  的节点都在大于或等于  *x*  的节点之前。
139+
// 思路:将大于 x 的节点,放到另外一个链表,最后连接这两个链表, 无需排序
140+
func PartitionX(head *ListNode, x int) *ListNode {
141+
headDummy := &ListNode{}
142+
tailDummy := &ListNode{}
143+
144+
headDummy.next = head
145+
current := headDummy
146+
tail := tailDummy
147+
for current.next != nil {
148+
if current.next.val.(int) < x {
149+
current = current.next
150+
} else {
151+
tail.next = current.next
152+
tail = tail.next
153+
current.next = current.next.next
154+
}
155+
}
156+
157+
tail.next = nil
158+
current.next = tailDummy.next
159+
160+
return headDummy.next
161+
}
162+
163+
func Xxx() {
164+
type A struct {
165+
x int
166+
y int
167+
z []int
168+
}
169+
a := &A{
170+
x: 0,
171+
y: 1,
172+
z: make([]int, 0),
173+
}
174+
a.z = append(a.z, 1)
175+
176+
fmt.Printf("a.ptr:%p a.x:%d a.y:%d, a.z:%v \n", a, a.x, a.y, a.z)
177+
178+
c := a
179+
a.x = 10
180+
a.y = 11
181+
c.z = append(c.z, 10)
182+
fmt.Printf("c.ptr:%p c.x:%d c.y:%d, c.z:%v \n", c, c.x, c.y, c.z)
183+
fmt.Printf("a.ptr:%p a.x:%d a.y:%d, a.z:%v \n", a, a.x, a.y, a.z)
184+
}

src/linkedlist/list_test.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,3 +31,19 @@ func TestReverseList(t *testing.T) {
3131
head.Print()
3232
ReverseList(head).Print()
3333
}
34+
35+
func TestReverseListMN(t *testing.T) {
36+
head := NewIntList([]int{1, 2, 3, 4, 5})
37+
head.Print()
38+
ReverseListMN(head, 1, 3).Print()
39+
}
40+
41+
func TestPartitionX(t *testing.T) {
42+
head := NewIntList([]int{5, 4, 3, 1, 2})
43+
head.Print()
44+
PartitionX(head, 3).Print()
45+
}
46+
47+
func TestXxx(t *testing.T) {
48+
Xxx()
49+
}

src/nums/nums.go

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package nums
2+
3+
import "sort"
4+
5+
func SubSets(nums []int) [][]int {
6+
if len(nums) == 0 {
7+
return [][]int{{}}
8+
}
9+
10+
cur := nums[len(nums)-1]
11+
res := SubSets(nums[:len(nums)-1])
12+
l := len(res)
13+
for i := 0; i < l; i++ {
14+
res = append(res, append(res[i], cur))
15+
}
16+
return res
17+
}
18+
19+
func SubSetsV2(nums []int) [][]int {
20+
var (
21+
backtrack func(nums []int, track []int, res *[][]int)
22+
23+
res = make([][]int, 0)
24+
track = make([]int, 0)
25+
)
26+
27+
backtrack = func(nums []int, track []int, res *[][]int) {
28+
tmp := make([]int, len(track))
29+
copy(tmp, track)
30+
*res = append(*res, tmp)
31+
32+
for i := 0; i < len(nums); i++ {
33+
track = append(track, nums[i])
34+
backtrack(nums[i+1:], track, res)
35+
track = track[:len(track)-1]
36+
}
37+
}
38+
39+
backtrack(nums, track, &res)
40+
41+
return res
42+
}
43+
44+
func Combine(n, k int) [][]int {
45+
var (
46+
backtrack func(n, pos, k int, track []int, res *[][]int)
47+
48+
res = make([][]int, 0)
49+
track = make([]int, 0)
50+
)
51+
52+
backtrack = func(n, pos, k int, track []int, res *[][]int) {
53+
if len(track) == k {
54+
ans := make([]int, k)
55+
copy(ans, track)
56+
*res = append(*res, ans)
57+
return
58+
}
59+
60+
for i := pos; i <= n; i++ {
61+
track = append(track, i)
62+
backtrack(n, i+1, k, track, res)
63+
track = track[:len(track)-1]
64+
}
65+
}
66+
67+
backtrack(n, 1, k, track, &res)
68+
69+
return res
70+
}

src/nums/nums_test.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package nums
2+
3+
import (
4+
"fmt"
5+
"testing"
6+
)
7+
8+
func TestSubSets(t *testing.T) {
9+
fmt.Println(SubSets([]int{1, 2, 3}))
10+
fmt.Println(SubSetsV2([]int{1, 2, 3}))
11+
}
12+
13+
func TestCombine(t *testing.T) {
14+
fmt.Println(Combine(4, 2))
15+
}

src/str/str.go

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
package str
22

3+
import (
4+
"fmt"
5+
"strings"
6+
)
7+
38
// O(m*n)
49
func Contain(haystack string, needle string) int {
510
if len(needle) == 0 {
@@ -18,3 +23,68 @@ func Contain(haystack string, needle string) int {
1823
}
1924
return -1
2025
}
26+
27+
// 判断s 是否是t 的子序列;可由t删减若干字符得到,但相对顺序不变
28+
// ace abcde true
29+
// cae abcde false
30+
func SubStr(s, t string) bool {
31+
curIndex := 0
32+
i := 0
33+
for ; i < len(s); i++ {
34+
println("before", i, curIndex)
35+
println(s[i : i+1])
36+
println(t[curIndex:])
37+
tmp := strings.Index(t[curIndex:], s[i:i+1])
38+
println("tmp", tmp)
39+
40+
if tmp < 0 {
41+
break
42+
}
43+
curIndex += 1 + tmp
44+
println("after", i, curIndex)
45+
}
46+
47+
if i == len(s) {
48+
return true
49+
}
50+
return false
51+
}
52+
53+
func Permute(nums []int) [][]int {
54+
result := make([][]int, 0)
55+
list := make([]int, 0)
56+
// 标记这个元素是否已经添加到结果集
57+
visited := make([]bool, len(nums))
58+
backtrack(nums, visited, list, &result)
59+
return result
60+
}
61+
62+
// nums 输入集合
63+
// visited 当前递归标记过的元素
64+
// list 临时结果集(路径)
65+
// result 最终结果
66+
func backtrack(nums []int, visited []bool, list []int, result *[][]int) {
67+
// 返回条件:临时结果和输入集合长度一致 才是全排列
68+
if len(list) == len(nums) {
69+
ans := make([]int, len(list))
70+
copy(ans, list)
71+
*result = append(*result, ans)
72+
return
73+
}
74+
for i := 0; i < len(nums); i++ {
75+
// 已经添加过的元素,直接跳过
76+
if visited[i] {
77+
continue
78+
}
79+
// 添加元素
80+
list = append(list, nums[i])
81+
visited[i] = true
82+
backtrack(nums, visited, list, result)
83+
// 移除元素
84+
visited[i] = false
85+
86+
println("after loop index", i)
87+
fmt.Println(list)
88+
list = list[0 : len(list)-1]
89+
}
90+
}

src/str/str_test.go

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,22 @@
11
package str
22

3-
import "testing"
3+
import (
4+
"fmt"
5+
"testing"
6+
)
47

58
func TestContain(t *testing.T) {
69
str := "abcdeqqqqqwww"
710
needle := "www"
811
println(Contain(str, needle))
912
}
13+
14+
func TestSubStr(t *testing.T) {
15+
s := "ccae"
16+
ss := "abcdeeeca"
17+
println(SubStr(s, ss))
18+
}
19+
20+
func TestPermute(t *testing.T) {
21+
fmt.Println(Permute([]int{1, 2, 3}))
22+
}

0 commit comments

Comments
 (0)