内容简介:[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
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Web Designer Idea
梁景红 / 电子工业出版社 / 2006年 / ¥55.00
这是一本以“目的、信息、设计、创意”作为根脉的关于网页视觉的书籍,畅谈的话题从策划到编辑再到设计,从而讨论“我们要建立怎样的站点,并以何种形式完成它”的问题。 全书共分四个部分,分别是网站建设目的,网站信息内容,页面形式设计,网页创作构思。 四部分有机地结合,形成一个统一的整体。“目的”部分以建设网站的目的为主,带领设计师从建站目的的角度,探讨如何抓住首要问题;如何建立网站雏形;如何打开狭隘的、局......一起来看看 《Web Designer Idea》 这本书的介绍吧!