1. 两数之和 Two Sum
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
示例 1:
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
示例 2:
输入:nums = [3,2,4], target = 6
输出:[1,2]
示例 3:
输入:nums = [3,3], target = 6
输出:[0,1]
提示:
2 <= nums.length <= 10^4-10^9 <= nums[i] <= 10^9-10^9 <= target <= 10^9- 只会存在一个有效答案
进阶:你可以想出一个时间复杂度小于 O(n^2) 的算法吗?
代码:
package main import ( "fmt" ) func twoSum(nums []int, target int) []int { imap := make(map[int]int) for i := 0; i < len(nums); i++ { two := target - nums[i] if _, ok := imap[two]; ok { return []int{imap[two], i} } imap[nums[i]] = i } return nil } func main() { nums := []int{2, 7, 11, 15} target := 9 fmt.Println(twoSum(nums, target)) nums = []int{3, 2, 4} target = 6 fmt.Println(twoSum(nums, target)) nums = []int{3, 3} fmt.Println(twoSum(nums, target)) }
输出:
[0 1]
[1 2]
[0 1]
2. 两数相加 Add Two Numbers
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例 1:
输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.
示例 2:
输入:l1 = [0], l2 = [0]
输出:[0]
示例 3:
输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
输出:[8,9,9,9,0,0,0,1]
提示:
每个链表中的节点数在范围 [1, 100] 内
0 <= Node.val <= 9
题目数据保证列表表示的数字不含前导零
代码:
package main import ( "fmt" ) type ListNode struct { data int next *ListNode } func (head *ListNode) build(list []int) { for i := len(list) - 1; i >= 0; i-- { node := &ListNode{data: list[i]} node.next = head.next head.next = node } } func (head *ListNode) travel() { for p := head.next; p != nil; p = p.next { fmt.Print(p.data) if p.next != nil { fmt.Print("->") } } fmt.Println("<nil>") } func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode { if l1 == nil || l2 == nil { return nil } head := &ListNode{data: 0, next: nil} current := head carry := 0 for l1 != nil || l2 != nil { var x, y int if l1 == nil { x = 0 } else { x = l1.data } if l2 == nil { y = 0 } else { y = l2.data } current.next = &ListNode{data: (x + y + carry) % 10, next: nil} current = current.next carry = (x + y + carry) / 10 if l1 != nil { l1 = l1.next } if l2 != nil { l2 = l2.next } } if carry > 0 { current.next = &ListNode{data: carry % 10, next: nil} } return head.next } func main() { l1 := &ListNode{} l2 := &ListNode{} l1.build([]int{2, 4, 3}) l2.build([]int{5, 6, 4}) l1.travel() l2.travel() res := addTwoNumbers(l1, l2) res.travel() l1 = &ListNode{} l2 = &ListNode{} l1.build([]int{0}) l2.build([]int{0}) res = addTwoNumbers(l1, l2) res.travel() l1 = &ListNode{} l2 = &ListNode{} l1.build([]int{9, 9, 9, 9, 9, 9, 9}) l2.build([]int{9, 9, 9, 9}) res = addTwoNumbers(l1, l2) res.travel() }
输出:
2->4->3<nil>
5->6->4<nil>
7->0->8<nil>
0<nil>
8->9->9->9->0->0->0->1<nil>
3. 无重复字符的最长子串
Longest substring without repeating characters
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
提示:
0 <= s.length <= 5 * 10^4
s 由英文字母、数字、符号和空格组成
代码:
package main import ( "fmt" ) func lengthOfLongestSubstring(s string) int { if len(s) == 0 { return 0 } var freq [256]int res, left, right := 0, 0, -1 for left < len(s) { if right+1 < len(s) && freq[s[right+1]-'a'] == 0 { freq[s[right+1]-'a']++ right++ } else { freq[s[left]-'a']-- left++ } tmp := right - left + 1 if tmp > res { res = tmp } } return res } func main() { str := "abcabcbb" fmt.Println(lengthOfLongestSubstring(str)) str = "bbbbb" fmt.Println(lengthOfLongestSubstring(str)) str = "pwwkew" fmt.Println(lengthOfLongestSubstring(str)) }
输出:
3
1
3
