1. 两数之和 - 力扣(LeetCode) (leetcode-cn.com)
func twoSum(nums []int, target int) []int {
dict := make(map[int]int)
for i, num := range nums {
if j, ok := dict[target - num]; ok {
return []int{j, i}
}
dict[num] = i
}
return nil
}
- golang的map只声明是空的,不能直接赋值;如果需要直接赋值,应该用make函数创建一个map。切片同样如此。
- 切片和数组不能直接用大括号加元素的方式表示,必须加上数据类型。
2. 两数相加 - 力扣(LeetCode) (leetcode-cn.com)
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
dummy := &ListNode{}
p := dummy
carry := 0
for l1 != nil && l2 != nil {
sum := l1.Val + l2.Val + carry
p.Next = &ListNode{
Val : sum % 10,
}
carry = sum / 10
l1 = l1.Next
l2 = l2.Next
p = p.Next
}
for l1 != nil {
sum := l1.Val + carry
p.Next = &ListNode{
Val : sum % 10,
}
carry = sum / 10
l1 = l1.Next
p = p.Next
}
for l2 != nil {
sum := l2.Val + carry
p.Next = &ListNode{
Val : sum % 10,
}
carry = sum / 10
l2 = l2.Next
p = p.Next
}
if carry > 0 {
p.Next = &ListNode{
Val : carry,
}
}
return dummy.Next
}
- golang的循环只有for,没有while。
- golang的初始化语句和标志语句是可选的,但与C++不同的是,省略这两个语句后分号也要省去。
- golang创建一个对象通常不用new关键词,而是直接通过&符号创建。
3. 无重复字符的最长子串 - 力扣(LeetCode) (leetcode-cn.com)
func lengthOfLongestSubstring(s string) int {
dict := map[byte]int{}
n := len(s)
rk, ans := -1, 0
for i := 0; i < n; i++ {
if i > 0 {
delete(dict, s[i - 1])
}
for rk + 1 < n && dict[s[rk + 1]] == 0 {
dict[s[rk + 1]]++
rk++
}
ans = max(ans, rk - i + 1)
}
return ans
}
func max(i, j int) int {
if i > j {
return i
}
return j
}
- golang中map除了使用make的方式创建,也可以使用map[byte]int{}这种方式创建。
- golang没有char类型,用byte类型代替。
- golang没有max函数。。。因为golang不支持重载,所以只有一个math.Max(float, float), 其他的类型自己实现吧。
- golang中map使用delete函数进行删除(即使该元素不存在delete也是安全的),插入元素直接赋值即可,查询元素也是直接取值,用返回的ok判断是否存在。