2016.9.4 Leetcode (2)338.Counting Bits

题目内容如下:

屏幕快照 2016-09-04 20.53.32.png

解法一 Your runtime beats <u>2.96%</u> of cppsubmissions.

class Solution {
public:
    vector<int> countBits(int num) {
         vector<int> countBits;
        for(int i = 0; i<=num; i++){
            int count=0;
            int temp1=i;
            while(temp1>0){
                //将这个数与1进行异或,也就是将其二进制的最低位与1进行异或,
                //因为1^1=0;0^1=0, 
                //所以如果异或结果变小了,那么最低位就是1,如果异或结果变大了,那么最低位就是0.
                int res=temp1^1;
                if(temp1>res)
                    count++;
                //然后将这个数右移一位,再次进行循环异或
                temp1>>=1;
            }
            countBits.push_back(count);
        }
        return countBits;
    }
};

解法二 Your runtime beats <u>19.25%</u> of cppsubmissions.
思路:将所有数都写出来,发现这个数组的规律是
{0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4...}
可看到如果分别数到第0,2,4,8,16个的时候,每一组都是在上一组的数值上加1,所以这道题的解法也就出来了

class Solution{
public:
      vector<int> countBits(int num){
            vector<result> res;

            ans.push_back(0);//奠定第一个值
            if(num == 0)
                return and;
            
            
            for(int i = 1; j=0; i<=num;i++){
                  if(i>=pow(2,j+1))
                        j++;
                  ans.push_back(ans.at(i-pow(2,j))+1);
            }
            return ans;
    }
};

解法三:Your runtime beats <u>3.45%</u> of cppsubmissions.

class Solution {
public:
    vector<int> countBits(int num) {
         vector<int> res;

            res.push_back(0);//奠定第一个值
            if(num == 0)
                return res;
            
            
            for(int i = 1, j=0; i<=num;i++){
                  res.push_back(res.at(i/2)+i%2);
            }
            return res;
    }
};

解法四:Your runtime beats <u>77.64%</u> of cppsubmissions.
思路:受闺蜜启发,感觉这个规律很牛逼。

class Solution {
public:
    vector<int> countBits(int num) {
         vector<int> res;

            res.push_back(0);
            if(num == 0)
                return res;
            
            
            for(int i = 1; i<=num;i++){
                int temp = i&(i-1);
                res.push_back(res.at(temp)+1);
            }
            return res;
    }
};

解法五:Your runtime beats <u>98.12%</u> of cppsubmissions.
思路:将res.at换成res[],速度稍有提升

class Solution {
public:
    vector<int> countBits(int num) {
         vector<int> res;

            res.push_back(0);
            if(num == 0)
                return res;
            
            
            for(int i = 1; i<=num;i++){
                int temp = i&(i-1);
                res.push_back(res[temp]+1);
            }
            return res;
    }
};

遇到的问题:比如说最后一种解法,第一次看details,时间是98.12%,第二次再看details,时间就是50%多了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • PLEASE READ THE FOLLOWING APPLE DEVELOPER PROGRAM LICENSE...
    念念不忘的阅读 14,599评论 5 6
  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 14,354评论 0 33
  • 在群山环绕里长大,很难想象那么一片海,高雅虚幻的浅蓝,带着斑驳的岸的图影,咸湿的空气里,膨胀着风的气息,海浪...
    蜀葵sun阅读 2,635评论 0 2
  • 看了一个视频,说的是年轻人不要老是嚷嚷着自己老了。记得最清楚的是,青春只有一次,今天是你余生中最年轻的一天,如果不...
    祁羽居士阅读 2,361评论 9 1
  • 望着坐卧在茶几前的地毯上,把书包整理的妹妹,我的心头实在不是一番滋味。没想到时间究竟还是这样不经意间就逝去了一大截...
    okay_先生阅读 1,868评论 0 3

友情链接更多精彩内容