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

231.2的幂-简单

题目描述:
给你一个整数 n,请你判断该整数是否是 2 的幂次方。如果是,返回 true ;否则,返回 false 。
如果存在一个整数 x 使得 n == 2x ,则认为 n 是 2 的幂次方。
进阶:你能够不使用循环/递归解决此问题吗?

题解:
进阶只能想到穷举,当然我知道肯定不会是穷举,所以最后还是写了个循环。官方题解是位运算,我已经记不得是第几次没想到位运算了,下次一定记住,看到数字就先想位运算

代码(Go):

//贴个官方题解吧,循环谁都会写
func isPowerOfTwo(n int) bool {
    return n > 0 && n&(n-1) == 0
}

剑指 Offer 57 - II. 和为s的连续正数序列-简单

题目描述:
输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。
序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。

题解:
可以看到,答案正整数列的最大数不超过target一半再加1,所以设其为循环终止条件,用双指针分别指向数列的起点和终点,用temp变量存储数列中所有数的和,若该和大于target则指针起点右移,数列变小,若小于target则指针终点右移,数列变大。相等时将数列保存下来,然后让数列整体右移一位,判断下一个可能符合条件的数列

代码(Go):

func findContinuousSequence(target int) [][]int {
    p,q := 1,1
    temp := 0
    var sce = [][]int{}
    for q <= target/2 + 1{
        if temp + q == target{
            var scei = []int{}
            for j := p;j <= q;j++{
                scei = append(scei,j)
            }
            sce = append(sce, scei)
            temp = temp + q - p
            p++
            q++
        }else if temp + q < target{
            temp = temp + q
            q++
        }else{
            temp = temp - p
            p++
        }
    }
    return sce
}

1047. 删除字符串中的所有相邻重复项-简单

题目描述:
给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。
在 S 上反复执行重复项删除操作,直到无法继续删除。
在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。

题解:
用了双层循环,最后超时了,官方题解是用栈做的,只要有和栈顶元素相等的元素就消去,否则就入栈

455.分发饼干-简单

题目描述:
假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。
对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都有一个尺寸 s[j] 。如果 s[j] >= g[i],我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。

题解:
排序加双指针,顺序状态下使用双指针可以很容易的在两个数组都只遍历一次的情况下完成任务。

代码(Go):

func findContentChildren(g []int, s []int) int {
    sort.Ints(g)
    sort.Ints(s)
    j := 0
    temp := 0
    for i := 0;i < len(s);i++{
        if s[i] >= g[j]{
            temp++
            if j == len(g) - 1{
                return temp
            }
            j++
        }
    }
    return temp
}

剑指 Offer 61. 扑克牌中的顺子-简单

题目描述:
从若干副扑克牌中随机抽 5 张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王为 0 ,可以看成任意数字。A 不能视为 14。

题解:
先对数组进行排序,然后判断大小王的数量并保存,接下来就可以一次判断数组元素是否可以连成顺子,当不满足顺子条件时,可以使用大小王代替,当大小王数量也为0时返回false

代码(Go):

func isStraight(nums []int) bool {
    sort.Ints(nums)
    num0 := 0
    temp := -1
    for i := 0;i < 5;i++{
        if nums[i] == 0{
            num0++
        }else if temp == -1{
            temp = nums[i]
        }else if temp != nums[i] - 1 && num0 > 0{
            num0--
            temp++
            i--
        }else if temp != nums[i] - 1 && num0 == 0{
            return false
        }else{
            temp = nums[i]
        }
    }
    return true
}

总结

栈和队列的操作不是很熟练,需要重点加强一下

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值