zoukankan      html  css  js  c++  java
  • Leetcode 600 不含连续1的非负整数

    给定一个正整数 n,找出小于或等于 n 的非负整数中,其二进制表示不包含 连续的1 的个数。

    例如:

    输入: 5
    输出: 5
    解释: 
    下面是带有相应二进制表示的非负整数<= 5:
    0 : 0
    1 : 1
    2 : 10
    3 : 11
    4 : 100
    5 : 101
    其中,只有整数3违反规则(有两个连续的1),其他5个满足规则。
    说明: 1 <= n <= 1e9

    解:分情况讨论
    记录f[i]为000...11111(i个1)中不包含连续的1的个数。
    当i位为0,则右面的几位可以不受当前为影响f[i-1];当i位位1,则下一位只能为0,i-2位受影响,f[i-2];得f[i]=f[i-1]+f[i-2];
    接下来对于任意一个数,可以分为比如9 1001b,可以分为0000-0111 和 1000-1001两部分,第一部分可以直接得到,第二部分属于多出的部分,需要继续拆解。
    所以每当遇到当前位1加上f[i],如果当前位为0,的没有多出,无影响,继续往下。当发现当前为1而且下一位也为1的时候,因为下一位只能取0,所以能选取的数都比下一位为1的时候要小,所以直接返回。
    int findIntegers(int num) 
    {
      if(num<2)
        return num+1;
      int f[30];
      f[0]=1;
      f[1]=2;
      for(int i=2;i<30;i++)
      {
        f[i]=f[i-1]+f[i-2];
      }
      int ans=0;
      for(int i=29;i>=0;i--)
      {
      if((num>>i)&1)
      {
        ans+=f[i];
        if(num>>(i+1)&1)
        {
        return ans;
        }
      }
      }
    return ans+1;
    }
  • 相关阅读:
    java入门最好的一套书
    【转载】vim的E492错误
    SESSION保存到数据库中,然后从数据库中读取
    django教程
    用vim写python代码的两个关键设置
    HTTP/1.1中文版
    SQL基础教程
    简单清晰的HTML教程
    vim中如何按一个键就保存文件
    【转载】Vim操作
  • 原文地址:https://www.cnblogs.com/pengpenggege/p/9388282.html
Copyright © 2011-2022 走看看