从零开始的力扣刷题记录-第二十六天

力扣每日四题

  • 171.Excel表列序号-简单
  • 面试题 02.02. 返回倒数第 k 个节点-简单
  • 303. 区域和检索 - 数组不可变-简单
  • 17. 电话号码的字母组合-中等
  • 总结

171.Excel表列序号-简单

题目描述:
给你一个字符串 columnTitle ,表示 Excel 表格中的列名称。返回 该列名称对应的列序号 。

题解:
直接遍历

代码(Go):

func titleToNumber(columnTitle string) int {
    re := 0
    for i := 0;i < len(columnTitle);i++{
        re = re*26 + int(columnTitle[i]) - 64
    }
    return re
}

面试题 02.02. 返回倒数第 k 个节点-简单

题目描述:
实现一种算法,找出单向链表中倒数第 k 个节点。返回该节点的值。
注意:本题相对原题稍作改动实现一种算法,找出单向链表中倒数第 k 个节点。返回该节点的值。
注意:本题相对原题稍作改动

题解:
双指针标准例题

代码(Go):

func kthToLast(head *ListNode, k int) int {
    p := head
    q := head
    for i := 1;i < k;i++{
        q = q.Next
    }
    for q.Next != nil{
        q = q.Next
        p = p.Next
    }
    return p.Val
}

303. 区域和检索 - 数组不可变-简单

题目描述:
给定一个整数数组 nums,处理以下类型的多个查询:
计算索引 left 和 right (包含 left 和 right)之间的 nums 元素的 和 ,其中 left <= right
实现 NumArray 类:
NumArray(int[] nums) 使用数组 nums 初始化对象
int sumRange(int i, int j) 返回数组 nums 中索引 left 和 right 之间的元素的 总和 ,包含 left 和 right 两点(也就是 nums[left] + nums[left + 1] + … + nums[right] )

题解:
可以直接遍历,但时间复杂度比较高,因为这个数组只需要处理两点之间的数值,所以可以通过前缀和的方式简化查询过程

代码(Go):

type NumArray struct {
    sums []int
}

func Constructor(nums []int) NumArray {
    sums := make([]int, len(nums)+1)
    for i, v := range nums {
        sums[i+1] = sums[i] + v
    }
    return NumArray{sums}
}

func (na *NumArray) SumRange(i, j int) int {
    return na.sums[j+1] - na.sums[i]
}

17. 电话号码的字母组合-中等

题目描述:
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

题解:
难是不难,恶心是真恶心,我自己的代码就不贴了,写的巨长巨麻烦,主要是没想到哈希表存字符串匹配的事,官方题解用个哈希表简单多了

代码(Go):

//官方题解
var phoneMap map[string]string = map[string]string{
    "2": "abc",
    "3": "def",
    "4": "ghi",
    "5": "jkl",
    "6": "mno",
    "7": "pqrs",
    "8": "tuv",
    "9": "wxyz",
}

var combinations []string

func letterCombinations(digits string) []string {
    if len(digits) == 0 {
        return []string{}
    }
    combinations = []string{}
    backtrack(digits, 0, "")
    return combinations
}

func backtrack(digits string, index int, combination string) {
    if index == len(digits) {
        combinations = append(combinations, combination)
    } else {
        digit := string(digits[index])
        letters := phoneMap[digit]
        lettersCount := len(letters)
        for i := 0; i < lettersCount; i++ {
            backtrack(digits, index + 1, combination + string(letters[i]))
        }
    }
}

总结

简单题比较基础,中等题其实也不难,主要是一步哈希表没想到浪费了大量时间

你可能感兴趣的:(leetcode刷题,leetcode,算法,golang)