Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

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)

AltStyle によって変換されたページ (->オリジナル) /