Leetcode刷题16-476.数字的补数(C++)

题目来源:链接: [https://leetcode-cn.com/problems/number-complement/comments/].

476.数字的补数

  • 1.问题描述
  • 2.我的解决方案
  • 3.大神们的解决方案
  • 4.我的收获

1.问题描述

给定一个正整数,输出它的补数。补数是对该数的二进制表示取反。

注意:

  1. 给定的整数保证在32位带符号整数的范围内。
  2. 你可以假定二进制数不包含前导零位。

示例1:

输入: 5
输出: 2
解释: 5的二进制表示为101(没有前导零位),其补数为010。所以你需要输出2。

示例2:

输入: 1
输出: 0
解释: 1的二进制表示为1(没有前导零位),其补数为0。所以你需要输出0。

2.我的解决方案

我的方法比较暴力,就是最直接的方法:先求出num的二进制,然后取反,再然后换算成十进制输出。
代码如下:

class Solution {
public:
    int findComplement(int num) {
        vector<int> res;
        int yushu;
        int j = 0, p = 1;
        int sum = 0;
        while(num)
        {
            yushu = num % 2;  
            num   = num / 2;
            res.push_back(yushu);
           
        }
        for(vector<int>::iterator it = res.begin(); it != res.end(); it++)
        {
            if(*it == 0)
            {
                *it = 1;
            }
            else
            {
                *it = 0;     //取反的操作也可以直接在下面的 for循环中  用三目运算符
            }                // res[i] = res[i] > 0 ? 0 : 1
        }
        for(int i = 0; i < res.size(); i++)
        {
               sum = sum + (res[i]*p);
               j++;
               p = pow(2,j); 
        }
        return sum;
        
    }
};
执行用时 : 8 ms, 在Number Complement的C++提交中击败了20.07% 的用户
内存消耗 : 9.1 MB, 在Number Complement的C++提交中击败了0.00% 的用户

3.大神们的解决方案

class Solution {
public:
    int findComplement(int num) {
        int temp = num;
        int c = 0;
        while ( temp > 0 ) {
            temp >>= 1;       //还没有理解大神的 思路
            c = ( c << 1 ) + 1;
        }
        return num ^ c;
    }
};

还不太理解移位的操作和概念,今后需要补强这方面的知识。

4.我的收获

1
原型:extern float pow(float x, float y);
用法:#include
功能:计算x的y次幂。
说明:x应大于零,返回幂指数的结果。
2.
还不太理解移位的操作和概念,今后需要补强这方面的知识

2019/3/8 胡云层 于南京 16

你可能感兴趣的:(LeetCode从零开始,LeetCode,C++)