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

本文介绍了力扣上的四道编程题目,包括反转字符串中的元音字母,使用双指针解决;汉明距离,通过计算二进制位不同来求解;找到所有数组中消失的数字,利用原地哈希策略;以及括号生成问题,通过动态规划实现有效括号组合。
摘要由CSDN通过智能技术生成

345. 反转字符串中的元音字母-简单

题目描述:
给你一个字符串 s ,仅反转字符串中的所有元音字母,并返回结果字符串。
元音字母包括 ‘a’、‘e’、‘i’、‘o’、‘u’,且可能以大小写两种形式出现不止一次。

题解:
一眼双指针,但是go语言字符串不让原地修改,去查了才知道可以用[]byte(s)获取切片

代码(Go):

func reverseVowels(s string) string {
    t := []byte(s)
    n := len(t)
    i, j := 0, n-1
    for i < j {
        for i < n && !strings.Contains("aeiouAEIOU", string(t[i])) {
            i++
        }
        for j > 0 && !strings.Contains("aeiouAEIOU", string(t[j])) {
            j--
        }
        if i < j {
            t[i], t[j] = t[j], t[i]
            i++
            j--
        }
    }
    return string(t)
}

461. 汉明距离-简单

题目描述:
两个整数之间的 汉明距离 指的是这两个数字对应二进制位不同的位置的数目。
给你两个整数 x 和 y,计算并返回它们之间的汉明距离。

题解:
模2取余比较是否相等,不相等距离加一。官方题解使用的异或后数一的个数做的

代码(Go):

func hammingDistance(x int, y int) int {
    re := 0
    for x != 0 || y != 0{
        tempx := x%2
        tempy := y%2
        if tempx != tempy{
            re++
        }
        x = x/2
        y = y/2
    }
    return re
}

448. 找到所有数组中消失的数字-简单

题目描述:
给你一个含 n 个整数的数组 nums ,其中 nums[i] 在区间 [1, n] 内。请你找出所有在 [1, n] 范围内但没有出现在 nums 中的数字,并以数组的形式返回结果。

题解:
用了个切片存储所有出现过的值,最后遍历切片找到没有出现的值。官方题解采用了一个很巧妙的方法节省了空间,在原数组上进行哈希,不需要额外的空间

代码(Go):

func findDisappearedNumbers(nums []int) []int {
    l := len(nums)
    var sce = make([]int,l + 1)
    re := []int{}
    for i := 0;i < l;i++{
        sce[nums[i]]++
    }
    for i := 1;i <= l;i++{
        if sce[i] == 0{
            re = append(re,i)
        }
    }
    return re
}

22.括号生成-中等

题目描述:
数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。

题解:
这个题真是废了老半天力气,主要是debug时候要一个一个对比确定是哪里没有考虑到,一开始我想的是加括号无非在左边加和最外边加,结果n=3的时候就出错了,我发现右边加和左边加有时候会不一样,然后我把这种情况考虑进去后n=4又出错了,我发现还有左边两层括号右边两层括号的情况。到这我才想明白本质不是左边加括号外边加括号,本质是最左边加了个左括号之后右边的括号加在哪,最后根据右边的括号加在不同的位置写了个循环动态规划得出了答案

代码(Go):

func generateParenthesis(n int) []string {
    dp := [][]string{}
    for i := 0;i <= n;i++{
        sce := []string{}
        if i == 0{
            sce = append(sce,"")
            dp = append(dp,sce)
        }else if i == 1{
            sce = append(sce,"()")
            dp = append(dp,sce)
        }
        if i > 1{
            for j := 0;j < i;j++{
                for _,vp := range dp[j]{
                    for _,vq := range dp[i - j - 1]{
                        sce = append(sce,"(" + vp + ")" + vq)
                    }
                }
            }
            dp = append(dp,sce)
        }
    }

    return dp[n]
}

总结

学到了字符串转切片,字符串containsAPI,鸽笼原理(数组原地哈希)。中等题的思考过程和最后与官方题解完全不同的动态规划方法也让我受益颇多

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值