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

文章介绍了四道力扣(LeetCode)的编程题目,包括字符串左旋转、排列硬币、种花问题和寻找最长连续序列的解决方案。分别使用Go语言实现,探讨了不同的解题思路,如字符串切片、二分查找和哈希表的应用,以及优化时间复杂度的方法。
摘要由CSDN通过智能技术生成

剑指 Offer 58 - II. 左旋转字符串-简单

题目描述:
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。

题解:
这题方法可太多了,最简单的就是切片,不过还是给出一个麻烦点的通解

代码(Go):

func reverseLeftWords(s string, n int) string {
    var re string
    for i := n;i < len(s);i++{
        re = re + string(s[i])
    }
    for i := 0;i < n;i++{
        re = re + string(s[i])
    }
    return re
}

441.排列硬币-简单

题目描述:
你总共有 n 枚硬币,并计划将它们按阶梯状排列。对于一个由 k 行组成的阶梯,其第 i 行必须正好有 i 枚硬币。阶梯的最后一行 可能 是不完整的。
给你一个数字 n ,计算并返回可形成 完整阶梯行 的总行数。

题解:
太简单导致大意了,直接暴力解了,看答案才想到还可以用二分查找和数学方法简化

代码(Go):

func arrangeCoins(n int) int {
    re := 0
    for i := 1;n - i >= 0;i++{
        re = i
        n -= i
    }
    return re
}

605.种花问题-简单

题目描述:
假设有一个很长的花坛,一部分地块种植了花,另一部分却没有。可是,花不能种植在相邻的地块上,它们会争夺水源,两者都会死去。
给你一个整数数组 flowerbed 表示花坛,由若干 0 和 1 组成,其中 0 表示没种植花,1 表示种植了花。另有一个数 n ,能否在不打破种植规则的情况下种入 n 朵花?能则返回 true ,不能则返回 false 。

题解:
遇到连续的3个0就说明可以种一朵花,此时将0的个数置1,因为只需要再遇到两个连续的0就可种一朵花,遇到1时将0的个数置0.开始时将0的个数置1。最后还需要检查一下0的数量,若此时为2则还可以再种一朵。

代码(Go):

func canPlaceFlowers(flowerbed []int, n int) bool {
    temp := 1
    for _,v := range flowerbed{
        if v == 0{
            temp++
        }
        if temp == 3{
            n--
            temp = 1
        }
        if n == 0{
            return true
        }
        if v == 1{
            temp = 0
        }
    }
    if temp == 2 && n == 1{
        return true
    }
    return false
}

128.最长连续序列-中等

题目描述:
给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。
请你设计并实现时间复杂度为 O(n) 的算法解决此问题。

题解:
排序后一次遍历即可找到最长连续序列,时间复杂度O(nlogn)。官方题解使用了哈希表,不需要排序,通过一次遍历加入哈希表再查找哈希表中值是否存在前序值,不存在时循环查找其后序值,通过此方法可以使每个值仅被遍历一次,达到O(n)的时间复杂度

代码(Go):

func longestConsecutive(nums []int) int {
    if len(nums) == 0{
        return 0
    }
    if len(nums) == 1{
        return 1
    }
    sort.Ints(nums)
    flag := 0
    temp,max := 1,1
    for i := 1;i < len(nums);i++{
        if nums[i] == nums[flag] + 1{
            flag++
            temp++
        }else if nums[i] == nums[flag]{
            flag++
        }else{
            flag = i
            if temp > max{
                max = temp
            }
            temp = 1
        }
    }
    if temp > max{
        max = temp
    }
    return max
}

总结

最近中等题居然异常的顺利,虽然不一定能想到时间复杂度最低的解法,但都能做出来,大进步

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值