[Leetcode 刷题集锦]

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
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值