Skip to content

Commit 208b96d

Browse files
author
lifengliu
committed
2017.6.5
1 parent 9797ccf commit 208b96d

19 files changed

+872
-0
lines changed

main.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package main
2+
3+
import (
4+
5+
)
6+
import (
7+
"fmt"
8+
"reflect"
9+
)
10+
11+
func main() {
12+
string := "abc"
13+
fmt.Println(reflect.TypeOf(string[1]))
14+
}
15+

question/Manacher's.markdown

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
Algorithm Manacher's
2+
problem:给定一个字符串,找出字符串的最长回文子串
3+
算法思路:
4+
step1:预处理子字符串,解决回文子串长度奇偶问题
5+
该思路是中心检测法一个升级。所有的空隙位置(包括首尾)插入同样的符号(在字符串中没有出现过的,例如 #),
6+
然后对处理过的字符串采用中心化检测法,取最大就得出我们想要的结果
7+
中心化检测法就是以字符串中的每一个字符为中心点,将其两侧的字符比较。但是如果不处理,就需要考虑其为偶数长度
8+
e.g. "aba"这个可以用中心化检测,"baab"就不能用中心化检测了。
9+
10+
处理之前:str1=abaaba
11+
处理之后:T=#a#b#a#a#b#a#
12+
现在我们遍历str2中的每一个字符(包含#),中心化检测他们的回文字符串
13+
e.g.T = # a # b # a # a # b # a #
14+
P = 0 1 0 3 0 1 6 1 0 3 0 1 0 (P数组是处理之后每个字符串对应的回文串长度,有的博客是从1开始,我这里是从0开始,结果不用减一)
15+
我们就以P[3]=3为例来解释。T[3]=b,开始中心化检测,T[2]=T[4]且T[1]=T[5],T[0]=T[6],所以P[3]=3
16+
现在目的很明确了,就是求P
17+
18+
step2:求P数组过程:
19+
确定两个变量
20+
一个是在遍历每个字符串时候,记录之前的字符扫到了最右的位置(max-right)例如我们上面P[3]比起之前的最远,是6(注意不是7),同时记录以此对应的字符下标max-id=3(从'b'扫到这里的)
21+
max-right 和 max-id
22+
遍历三大判断全过程:
23+
for(int i=0;i<T.length;i++) 遍历字符串每个字符
24+
step:判断当前字符的i是否小于或等于max-right。换句话说就是当前这个字符有没有被以前计算出来的回文数包括在内。
25+
如果小于:
26+
找出i关于当前max-id对称的点j,例如:例如i=5,max-id=3,j=1,然后我们要判断j被求出来的P[i]是否完全包含在max-id对应的回文串中
27+

question/Q1.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package main
2+
import "fmt"
3+
4+
//twoSum in leetcode question 1
5+
func twoSum(nums []int, target int) []int {
6+
var result=make([]int,2)
7+
var map1 =make(map[int]int)
8+
for i,number := range nums{
9+
10+
if _,ok:=map1[target-number];ok {
11+
result[1]=i
12+
result[0]=map1[target-number]
13+
return result
14+
}
15+
map1[number]=i
16+
}
17+
return result
18+
}
19+
20+
func main(){
21+
a := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 0}
22+
b:=twoSum(a,17)
23+
fmt.Println(b[0],b[1])
24+
}

question/Q11.go

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package main
2+
3+
import "fmt"
4+
5+
func main() {
6+
a := [3]int{1,2,1}
7+
fmt.Println(maxArea(a[:]))
8+
}
9+
10+
func maxArea(height []int) int {
11+
length:= len(height)
12+
left := 0
13+
right := length-1
14+
max :=0
15+
for left<right {
16+
max=maxInt(max,minInt(height[left],height[right])*(right-left))
17+
if height[left]<height[right] {
18+
left++
19+
}else{
20+
right--
21+
}
22+
}
23+
return max
24+
}
25+
26+
func maxInt(a,b int) int {
27+
if a>b {
28+
return a
29+
}
30+
return b
31+
}
32+
33+
func minInt(a,b int) int {
34+
if a>b {
35+
return b
36+
}
37+
return a
38+
}

question/Q12.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package main
2+
3+
import (
4+
"bytes"
5+
"fmt"
6+
)
7+
8+
func intToRoman(num int) string {
9+
value := []int{1000,900,500,400,100,90,50,40,10,9,5,4,1}
10+
str := []string{"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"}
11+
var buffer bytes.Buffer
12+
for k, v := range value {
13+
for num>=v {
14+
num-=v
15+
buffer.WriteString(str[k])
16+
}
17+
}
18+
return buffer.String()
19+
}
20+
21+
func main() {
22+
fmt.Println(intToRoman(1234))
23+
}

question/Q15.go

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
package main
2+
3+
import "fmt"
4+
5+
func main() {
6+
value := []int{-1,0,1,2,-1,-4}
7+
8+
fmt.Println(threeSum(value))
9+
}
10+
11+
func threeSum(nums []int) [][]int {
12+
if len(nums)<3{
13+
return [][]int{}
14+
}
15+
var sli [][]int
16+
var map1 =make(map[int]int)
17+
quickSort(nums,0,len(nums)-1)
18+
for i,v := range nums{
19+
if v>0 {
20+
break
21+
}
22+
if _,ok:=map1[v];ok {
23+
continue
24+
}
25+
map1[v]=i
26+
res:=findEr(nums,i+1,len(nums)-1,v)
27+
if len(res)==0{
28+
continue
29+
}
30+
for k,val := range res {
31+
sli=append(sli,[]int{v,k,val})
32+
}
33+
}
34+
return sli
35+
}
36+
37+
func quickSort(arr []int, start int, end int) {
38+
39+
if len(arr)==0{
40+
return
41+
}
42+
43+
var key int = arr[start]
44+
var low int = start
45+
var high int = end
46+
47+
for {
48+
for low < high {
49+
if arr[high] < key {
50+
arr[low] = arr[high]
51+
break
52+
}
53+
high--
54+
}
55+
for low < high {
56+
if arr[low] > key {
57+
arr[high] = arr[low]
58+
break
59+
}
60+
low++
61+
}
62+
if low >= high {
63+
arr[low] = key
64+
break
65+
}
66+
}
67+
if low-1 > start {
68+
quickSort(arr, start, low-1)
69+
}
70+
if high+1 < end {
71+
quickSort(arr, high+1, end)
72+
}
73+
}
74+
75+
func findEr(arr []int,left,right,target int)map[int]int{
76+
var map1 = make(map[int]int)
77+
for left <right {
78+
if arr[left]+arr[right]+target ==0 {
79+
map1[arr[left]]=arr[right]
80+
for left<right&&arr[left]==arr[left+1]{
81+
left++
82+
}
83+
for left<right && arr[right]==arr[right-1]{
84+
right--
85+
}
86+
left++
87+
right--
88+
}else if arr[left]+arr[right]+target<0{
89+
left++
90+
}else{
91+
right--
92+
}
93+
}
94+
return map1
95+
}
96+
97+
func tSum(arr []int,left,right,target int)map[int]int {
98+
var map1 = make(map[int]int)
99+
var result = make(map[int]int)
100+
var i int
101+
for i = left; i < right+1; i++ {
102+
if _, ok := map1[target - arr[i]]; ok {
103+
result[target - arr[i]] = arr[i]
104+
}
105+
map1[arr[i]] = i
106+
}
107+
return result
108+
}
109+

question/Q16.go

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
6+
)
7+
8+
func main() {
9+
value := []int{-1,0,1,2,-1,-4,9}
10+
quickSort(value,0,len(value)-1)
11+
fmt.Println(value)
12+
}
13+
func quickSort(sortArray []int, left, right int) {
14+
if left < right {
15+
pos := partition(sortArray, left, right)
16+
quickSort(sortArray, left, pos-1)
17+
quickSort(sortArray, pos+1, right)
18+
}
19+
}
20+
21+
func partition(arr []int,left,right int)int{
22+
if len(arr)==0{
23+
return -1
24+
}
25+
pivot := arr[left]
26+
for left<right {
27+
for left<right && arr[right]>=arr[left]{
28+
right--
29+
}
30+
if left<right {
31+
arr[left]=arr[right]
32+
left++
33+
}
34+
for left<right && arr[left]<=pivot{
35+
left++
36+
}
37+
if left<right{
38+
arr[right]=arr[left]
39+
right--
40+
}
41+
}
42+
arr[left]=pivot
43+
return left
44+
}
45+
46+
// Swap the position of a and b
47+
func swap(arr []int,a, b int) {
48+
arr[a], arr[b] = arr[b], arr[a]
49+
}

question/Q19.go

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
6+
)
7+
8+
func main() {
9+
a1:=ListNode{1,nil}
10+
11+
//result:=&a1
12+
//1 2 3 4 5
13+
res:=removeNthFromEnd(&a1,1)
14+
for res!=nil {
15+
fmt.Println(res.Val)
16+
res=res.Next
17+
}
18+
}
19+
type ListNode struct{
20+
Val int
21+
Next *ListNode
22+
}
23+
24+
func removeNthFromEnd(head *ListNode, n int) *ListNode {
25+
l1:=head
26+
l2:=head
27+
for l1 != nil{
28+
l1=l1.Next
29+
if n <0{
30+
l2=l2.Next
31+
}
32+
n--
33+
}
34+
if n==0 {
35+
head=head.Next
36+
}else{
37+
l2.Next=l2.Next.Next
38+
}
39+
return head
40+
}

0 commit comments

Comments
 (0)