letcode(868)解题思路

每日一题

题目

给定一个正整数 n,找到并返回 n 的二进制表示中两个 相邻 1 之间的 最长距离 。如果不存在两个相邻的 1,返回 0 。

如果只有 0 将两个 1 分隔开(可能不存在 0 ),则认为这两个 1 彼此 相邻 。两个 1 之间的距离是它们的二进制表示中位置的绝对差。例如,“1001” 中的两个 1 的距离为 3 。

例子
输入:n = 22
输出:2
解释:22 的二进制是 “10110” 。
在 22 的二进制表示中,有三个 1,组成两对相邻的 1 。
第一对相邻的 1 中,两个 1 之间的距离为 2 。
第二对相邻的 1 中,两个 1 之间的距离为 1 。
答案取两个距离之中最大的,也就是 2 。

解题思路

1.先遍历一遍正整数的二进制形式的字符串,找到并将其所在位置放到列表中
2.遍历位置列表,计算相邻的两个位置的差值
3.找出差值的最大值并返回

解题过程

    def binaryGap(self, n):
        """
        :type n: int
        :rtype: int
        """
        bin_str = bin(n)
        input_str = bin_str[2:]
        reducer_list = []
        for index, number in enumerate(input_str):
            if number == '1':
                reducer_list.append(index)
        max_item = 0
        for i in range(1, len(reducer_list), 1):
            max_item = max(max_item, reducer_list[i] - reducer_list[i - 1])
        return max_item

涉及知识点

字典用法(*)

自定义循环遍历(*)

总结评语

第一遍审题失误,还以为距离的计算方法是不用考虑两个1中间的1值的,以后注意,不要把题审过了。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值