用go語言做算法題
- 兩數(shù)之和
給定一個整數(shù)數(shù)組 nums 和一個目標值 target钉答,請你在該數(shù)組中找出和為目標值的那 兩個 整數(shù)舍败,并返回他們的數(shù)組下標威沫。
你可以假設每種輸入只會對應一個答案帽衙。但是壳快,數(shù)組中同一個元素不能使用兩遍纸巷。
示例:
給定 nums = [2, 7, 11, 15], target = 9
因為 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
解題思路:
遍歷數(shù)組,把target與數(shù)組中的元素做減法眶痰,如果在map中存在差值對應的數(shù)據(jù)瘤旨,則把當前位置和差值位置返回即找到答案
代碼如下:
func twoSum(nums []int, target int) []int {
myMap := make(map[int]int)
for i, v := range nums {
if c, ok := myMap[target-v]; ok {
return []int{c, i}
}
//存值和位置關系
myMap[v]=i
}
return nil
}
- 兩數(shù)相加
給出兩個 非空 的鏈表用來表示兩個非負的整數(shù)。其中竖伯,它們各自的位數(shù)是按照 逆序 的方式存儲的存哲,并且它們的每個節(jié)點只能存儲 一位 數(shù)字。
如果七婴,我們將這兩個數(shù)相加起來祟偷,則會返回一個新的鏈表來表示它們的和。
您可以假設除了數(shù)字 0 之外打厘,這兩個數(shù)都不會以 0 開頭修肠。
示例:
輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
輸出:7 -> 0 -> 8
原因:342 + 465 = 807
解題思路:
循環(huán)列表,把對應位置相加户盯,如果相加值>=10嵌施,需要減去10饲化,把值存在結(jié)果節(jié)點,進位值放到下一個列表中去
代碼如下:
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
var result, p *ListNode
lv := 0;
for {
if l1 == nil && l2 == nil && lv < 1{
break;
}
v1,v2 := 0,0;
if l1 != nil {
v1 = l1.Val
}
if l2 != nil {
v2 = l2.Val
}
v := v1 + v2 + lv;
lv = 0
if v >= 10 {
v -= 10
lv = 1
}
node := &ListNode{Val:v}
if result == nil {
result = node
p = node
} else {
result.Next = node
result = result.Next
}
if l1 != nil {
l1 = l1.Next
}
if l2 != nil {
l2 = l2.Next
}
}
return p
}
- 獨一無二的出現(xiàn)次數(shù)
給你一個整數(shù)數(shù)組 arr吗伤,請你幫忙統(tǒng)計數(shù)組中每個數(shù)的出現(xiàn)次數(shù)吃靠。
如果每個數(shù)的出現(xiàn)次數(shù)都是獨一無二的,就返回 true足淆;否則返回 false巢块。
示例 1:
輸入:arr = [1,2,2,1,1,3]
輸出:true
解釋:在該數(shù)組中,1 出現(xiàn)了 3 次缸浦,2 出現(xiàn)了 2 次夕冲,3 只出現(xiàn)了 1 次。沒有兩個數(shù)的出現(xiàn)次數(shù)相同裂逐。
示例 2:
輸入:arr = [1,2]
輸出:false
示例 3:
輸入:arr = [-3,0,1,-3,1,1,1,-3,10,0]
輸出:true
解題思路:
把每個值出現(xiàn)的次數(shù)存到map中歹鱼,然后再遍歷map,如果存在相同的值卜高,返回false弥姻,否則返回true
代碼如下:
func uniqueOccurrences(arr []int) bool {
result := make(map[int]int)
for _, v := range arr {
result[v]+=1
}
chkMap := map[int]bool{}
for _, c := range result {
if _,ok := chkMap[c]; ok {
return false
}
chkMap[c]=true;
}
return true
}