内容简介:[LeetCode]Non-negative Integers without Consecutive Ones
题目描述:
LeetCode 600. Non-negative Integers without Consecutive Ones
Given a positive integer n, find the number of non-negative integers less than or equal to n, whose binary representations do NOT contain consecutive ones .
Example 1:
Input: 5 Output: 5 Explanation: Here are the non-negative integers <= 5 with their corresponding binary representations: 0 : 0 1 : 1 2 : 10 3 : 11 4 : 100 5 : 101 Among them, only integer 3 disobeys the rule (two consecutive ones) and the other 5 satisfy the rule.
Note: 1 <= n <= 10 9
题目大意:
给定正整数n,求小于等于n,并且二进制形式不包含连续1的数字的个数
注意:1 <= n <= 10 9
解题思路:
动态规划(Dynamic Programming)
参考:http://www.geeksforgeeks.org/count-number-binary-strings-without-consecutive-1s/
首先构造斐波那契数列dp = [1, 2, 3, 5, 8, 13 ...] 记num的二进制串为bnum,其长度为size 令结果ans = dp[size] 从高位到低位遍历bnum,记当前下标为idx: 若bnum[idx] == bnum[idx - 1] == '1': 说明出现两个连续的1,退出循环 若bnum[idx] == bnum[idx - 1] == '0': 说明出现连个连续的0,ans 减去 dp[size - idx] - dp[size - idx - 1] (等于dp[size - idx - 2])
Python代码:
class Solution(object): def findIntegers(self, num): """ :type num: int :rtype: int """ dp = [1, 2] for x in range(2, 32): dp.append(dp[x - 1]+ dp[x - 2]) bnum = bin(num)[2:] size = len(bnum) ans = dp[size] for idx in range(1, size): if bnum[idx] == bnum[idx - 1] == '1': break if bnum[idx] == bnum[idx - 1] == '0': ans -= dp[size - idx] - dp[size - idx - 1] return ans
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
产品心经:产品经理应该知道的60件事(第2版)
闫荣 / 机械工业出版社 / 2016-4 / 69.00
本书第一版出版后广获好评,应广大读者要求,作者把自己在实践中新近总结的10个关于产品的最佳实践融入到了这本新书中。这"10件事"侧重于深挖产品需求和产品疯传背后的秘密,配合之前的"50件事",不仅能帮产品经理打造出让用户尖叫并疯传的产品,还能帮助产品经理迅速全方位提升自己的能力。 本书作者有超过10年的产品工作经验,在互联网产品领域公认的大咖,这本书从产品经理核心素养、产品认知、战略与规划、......一起来看看 《产品心经:产品经理应该知道的60件事(第2版)》 这本书的介绍吧!