1. 两数之和
1.1 暴力法
func twoSum(nums []int, target int) []int {
var index [2]int
for i := 0; i < len(nums); i++ {
for j := i + 1; j < len(nums); j++ {
if nums[i]+nums[j] == target {
index[0] = i
index[1] = j
return index[:]
}
}
}
return index[:]
}
1.2 hash法
func twoSum(nums []int, target int) []int {
var index [2]int
var hmap map[int]int = make(map[int]int)
for i := 0; i < len(nums); i++ {
res := target - nums[i]
_, ok := hmap[res]
if !ok {
hmap[nums[i]] = i
} else {
index[0] = i
index[1] = hmap[res]
}
}
return index[:]
}
2. 两数相加
这道题在做的时候需要分四种情况:
1、l1和l2都不为空的时候需要相加
2、l1为空但l2不为空时候需要让l2加上offset
3、l1不为空但l2为空时候需要让l1加上offset
4、l1和l2都不为空的时候需要退出
其中情况2和情况3需要放置在条件1之前,因为在l1和l2长度不一样的时候,随着相加偏移后面节点的过程中,l1和l2必有一个先为空,此时就需要出发情况2或者情况3,但是这样的是不允许出现的。
package main
type ListNode struct {
Val int
Next *ListNode
}
func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
var list, head *ListNode
list = new(ListNode)
head = new(ListNode)
offset := 0
head = list
var node *ListNode
///[9,9,9,9,9,9,9] [9,9,9,9]
for {
if l1 == nil && l2 != nil {
list.Val = (l2.Val + offset) % 10
offset = (l2.Val + offset) / 10
l2 = l2.Next
}
if l1 != nil && l2 == nil {
list.Val = (l1.Val + offset) % 10
offset = (l1.Val + offset) / 10
l1 = l1.Next
}
if l1 != nil && l2 != nil {
list.Val = (l1.Val + l2.Val + offset) % 10
offset = (l1.Val + l2.Val + offset) / 10
l1 = l1.Next
l2 = l2.Next
}
if l1 == nil && l2 == nil {
break
} else {
node = new(ListNode)
list.Next = node
list = node
}
}
if offset == 1 {
list.Next = &ListNode{
Val: 1,
Next: nil,
}
}
return head
}
func main() {
l7 := &ListNode{Val: 9, Next: nil}
l6 := &ListNode{Val: 9, Next: l7}
l5 := &ListNode{Val: 9, Next: l6}
l4 := &ListNode{Val: 9, Next: l5}
l3 := &ListNode{Val: 9, Next: l4}
l2 := &ListNode{Val: 9, Next: l3}
l1 := &ListNode{Val: 9, Next: l2}
l14 := &ListNode{Val: 9, Next: nil}
l13 := &ListNode{Val: 9, Next: l14}
l12 := &ListNode{Val: 9, Next: l13}
l11 := &ListNode{Val: 9, Next: l12}
addTwoNumbers(l1, l11)
}
20.有效的括号
func isValid(s string) bool {
stack := make([]byte, 0)
for i := 0; i < len(s); i++ {
if len(stack) == 0 {
if s[i] == ')' || s[i] == ']' || s[i] == '}' {
return false
}
}
if s[i] == '(' || s[i] == '[' || s[i] == '{' {
stack = append(stack, byte(s[i]))
} else {
if (s[i] == ')' && stack[len(stack)-1] == '(') || (s[i] == ']' && stack[len(stack)-1] == '[') || (s[i] == '}' && stack[len(stack)-1] == '{') {
stack = stack[:len(stack)-1]
} else {
return false
}
}
}
if len(stack) == 0 {
return true
}
return false
}