LeetCode-476 Number Complement
来源:互联网 发布:手写英文识别软件 编辑:程序博客网 时间:2024/05/18 03:22
Given a positive integer, output its complement number. The complement strategy is to flip the bits of its binary representation.
Note:
- The given integer is guaranteed to fit within the range of a 32-bit signed integer.
- You could assume no leading zero bit in the integer’s binary representation.
Example 1:
Input: 5Output: 2Explanation: The binary representation of 5 is 101 (no leading zero bits), and its complement is 010. So you need to output 2.
Example 2:
Input: 1Output: 0Explanation: The binary representation of 1 is 1 (no leading zero bits), and its complement is 0. So you need to output 0.-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
原码、反码、补码的关系:
正数:反码 = 原码。
负数:反码 = 符号位不变,其余位取反。
补码 = 反码+1
补码:计算机中使用的是补码,而不是原码或反码。
为什么使用补码呢?
进行运算时,可以统一加减法(时钟原理、补码概念)。另外可以让符号位作为数值直接参与计算。
为什么不使用原码呢?
1. 使用原码的话,表示0时会出现二义性,[+0]原=00000000,[-0]原=10000000,
2. 使用原码进行运算时,符号位需要单独处理
反码只是作为补码和原码之间的桥梁
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
我的方法虽然通过了,但是感觉实在是太丑陋了,耗时29ms。
public class Solution { public int findComplement(int num) { int result=0; int count=0; int [] biresult = new int[32]; boolean flag = false; StringBuilder sb = new StringBuilder(); while(a!=0){ result= a%2; System.out.println("result: "+result); biresult[count]=result^1; count++; a=a/2;}if(count ==1){ System.out.println(biresult[count-1]);}if(count >1){ for(int i= count-1;i>=0;i--){ if(!flag && biresult[i] !=0){ flag = true;}if(flag){ sb.append(biresult[i]); } } if(!flag){sb.append(0); }}return Integer.parseInt(sb.toString(),2); }}
太丑陋了!!!!
比较好的方法如下,耗时9ms:
public class Solution { public int findComplement(int num) { int complementary = 0; int i = 31; while(((1<<i) & num)==0) i--; while(i >= 0){ int mask = (1 << i); int value = mask & num; if(value == 0) complementary |= mask; i--; } return complementary; }}
(1<<i) & num:找到lead位置
mask:左移leader位于num相与。如果与后结果为0,则表示位与num的位相反,然后与将要返回的结果做或操作,添加的结果的i位。
返回结果。
需要学习的地方:
1. 可用左移与的操作找到leader位。
2. mask的使用
阅读全文
0 0
- [leetcode-476]Number Complement
- leetcode-476- Number Complement
- leetcode 476 Number Complement
- Leetcode #476 Number Complement
- 【LeetCode】476 Number Complement
- leetcode 476 Number Complement
- LeetCode-476 Number Complement
- leetcode 476: Number Complement
- LeetCode 476 Number Complement
- LeetCode 476 : Number Complement
- Leetcode 476 Number Complement
- LeetCode(476): Number Complement
- LeetCode number 476 Number Complement
- leetcode 476 Number Complement C++
- LeetCode- 476 Number Complement(easy)
- LeetCode 476 Number Complement(位运算)
- LeetCode OJ 476 Number Complement [Easy]
- LeetCode 476 Number Complement 补数
- 在SRLID数据集上研究线性回归案例
- 你的不自律,正在慢慢毁掉你
- [DOC文档]文档链接的快速跳转
- Linux中关于信号的一些知识
- Android自定义View实现文本轮播效果
- LeetCode-476 Number Complement
- Linux系统编程:errno,perror,strerror
- Java Collection总结
- IT培训行业揭秘(三)
- Mac OS X shell类别
- VMware虚拟机中安装Linux系统
- 物理层安全截获概率散点图
- Linux下的信号(一)----信号的基本概念与产生
- java常考笔试题1