leetcode刷题1

用go语言做算法题

  1. 两数之和
    给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
    你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。

示例:

给定 nums = [2, 7, 11, 15], target = 9

因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

解题思路:
遍历数组,把target与数组中的元素做减法,如果在map中存在差值对应的数据,则把当前位置和差值位置返回即找到答案

代码如下:

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 
}
  1. 两数相加

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例:

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807

解题思路:
循环列表,把对应位置相加,如果相加值>=10,需要减去10,把值存在结果节点,进位值放到下一个列表中去
代码如下:

/**
 * 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
}
  1. 独一无二的出现次数
    给你一个整数数组 arr,请你帮忙统计数组中每个数的出现次数。
    如果每个数的出现次数都是独一无二的,就返回 true;否则返回 false。

示例 1:

输入:arr = [1,2,2,1,1,3]
输出:true
解释:在该数组中,1 出现了 3 次,2 出现了 2 次,3 只出现了 1 次。没有两个数的出现次数相同。

示例 2:

输入:arr = [1,2]
输出:false

示例 3:

输入:arr = [-3,0,1,-3,1,1,1,-3,10,0]
输出:true

解题思路:
把每个值出现的次数存到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
}

你可能感兴趣的:(leetcode刷题1)