这是小川的第377次更新,第404篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第238题(顺位题号是1009)。每个非负整数N都具有二进制表示。例如,5可以二进制表示为"101",11可以二进制表示为"1011",依此类推。

请注意,除N = 0外,任何二进制表示中都没有前导零。

二进制表示的补码是将1改为0和将0改为1时得到的二进制数。例如,二进制中"101"的补码是二进制的"010"

对于给定的十进制数N,将其二进制表示的补码作为十进制的整数返回。

例如:

输入:5

输出:2

说明:5是二进制"101",二进制补码"010",转为十进制是2。

输入:7

输出:0

说明:7是二进制"111",二进制补码"000",转为十进制是0。

输入:10

输出:5

说明:10是二进制"1010",二进制补码"0101",转为十进制是5。

注意

  • 0 <= N < 10^9

02 第一种解法

题目的意思是将N转为二进制,再求其二进制的补码(0和1互换),再将转换后的二进制补码转为十进制整数。

思路:利用异或位运算,例如5^7=2,那么我们要找到7,而7的二进制为111,长度和5的二进制101相等,但是全为1,所以先将5转为二进制字符串,使用一个32位长度的由1组成的字符串,截取对应长度的子串,再将截取出来的子串转为十进制数,利用得到的十进制数和N异或运算就可得到结果。

public int bitwiseComplement(int N) {
String str = Integer.toBinaryString(N);
String newStr = "11111111111111111111111111111111";
newStr = newStr.substring(0, str.length());
int num = Integer.valueOf(newStr, 2);
return N^num;
}

03 第二种解法

思路:将N转为二进制字符串,利用循环,将其中的0转为1,1转为0,变成新的二进制字符串,再将其转为十进制整数。

public int bitwiseComplement2(int N) {
String str = Integer.toBinaryString(N);
StringBuilder sb = new StringBuilder();
for (int i=0; i<str.length(); i++) {
sb.append(str.charAt(i) == '0' ? '1' : '0');
}
return Integer.valueOf(sb.toString(), 2);
}

04 第三种解法

思路和第一种解法类似,只是换了另外的方式来得到全是1的二进制数,全是1的二进制数可以通过1开头后面跟0的二进制数减1得到,例如8的二进制数1000,8减去1得到7,7的二进制数是111,而8可以通过1左移位运算3得到(也可以累乘2三次得到)。

public int bitwiseComplement3(int N) {
if (N < 2) {
return N == 0 ? 1 : 0;
}
int num = 1;
while (num <= N) {
// 换成 num *= 2; 效果一样
num <<= 1;
}
return N^(num-1);
}

05 小结

算法专题目前已连续日更超过七个月,算法题文章244+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,好看、留言、转发就是对我最大的回报和支持!

LeetCode.1009-十进制数的补码(Complement of Base 10 Integer)的更多相关文章

  1. [Swift]LeetCode1009. 十进制整数的补码 | Complement of Base 10 Integer

    Every non-negative integer N has a binary representation.  For example, 5 can be represented as &quo ...

  2. LeetCode 1012 Complement of Base 10 Integer 解题报告

    题目要求 Every non-negative integer N has a binary representation.  For example, 5 can be represented as ...

  3. #Leetcode# 1009. Complement of Base 10 Integer

    https://leetcode.com/problems/complement-of-base-10-integer/ Every non-negative integer N has a bina ...

  4. 【LeetCode】1012. Complement of Base 10 Integer 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...

  5. 【leetcode】1012. Complement of Base 10 Integer

    题目如下: Every non-negative integer N has a binary representation.  For example, 5 can be represented a ...

  6. 128th LeetCode Weekly Contest Complement of Base 10 Integer

    Every non-negative integer N has a binary representation.  For example, 5 can be represented as &quo ...

  7. 力扣(LeetCode)1009. 十进制整数的反码

    每个非负整数 N 都有其二进制表示.例如, 5 可以被表示为二进制 "101",11 可以用二进制 "1011" 表示,依此类推.注意,除 N = 0 外,任何 ...

  8. Java中实现十进制数转换为二进制的三种思路

    Java中实现十进制数转换为二进制 第一种:除基倒取余法 这是最符合我们平时的数学逻辑思维的,即输入一个十进制数n,每次用n除以2,把余数记下来,再用商去除以2...依次循环,直到商为0结束,把余数倒 ...

  9. 在Java中,为什么十六进制数0xFF取反之后对应的十进制数是-256呢?

    int number = 0xFF: 字面值是指在程序中无需变量保存,可直接表示为一个具体的数字或字符串的值. 0xFF是一个整数字面值,整数字面值的缺省类型是 int. 我们知道在Java中, in ...

随机推荐

  1. 三大方面,分析 to B和 to C产品的区别

    作为互联网从业者,我们经常听到to B(或2B)和to C(或2C)两个概念.to B即面向企业客户,to C即面向普通用户.只要是互联网人基本都懂知道这两个概念,但如果别人再问“to B和to C产 ...

  2. 一个原生ajax在jetbrains开发平台的调用方法

    这段随笔的记述目的无非是,一个html页面中可能有多段js代码,所以采用外引的方法应该会好一些 function checkfiles() { var xhr = new XMLHttpRequest ...

  3. qt5-Qt Creator使用

    设置编码: 工具-->选项-->文本编辑器-->行为-->编辑器 中文编译失败的解决: 编辑-->--> 在头文件中增加:--解决乱码问题(文本所在的头文件) #i ...

  4. 利用rand7() 产生rand10()(腾讯)

    题目1:已知rand7() 可以产生 1~7 的7个数(均匀概率),利用rand7()  产生rand10()   1~10(均匀概率) int rand10() { int temp; int te ...

  5. C++:std::map的遍历

    for (auto &kv : myMap) { count<<kv.first<<" has value "<<kv.second&l ...

  6. Codeforces #499 E Border ( 裴蜀定理 )

    题目链接 题意 : 给出 N 种纸币.并且给出面值.每种纸币的数量可以任选.问你得出来的数在 k 进制下.末尾位的数有多少种可能.输出具体方案 分析 : 纸币任意选择组成的和 可以用一个一次多项式来表 ...

  7. Nowcoder Circulant Matrix ( FWT )

    题目链接 题意 : 给你一个a数组和b数组,构造出A[i][j]矩阵(A[i][j] = a[i xor j]) 给出等式 A * x = b ( mod p ) n等于4的时候有: A[0][0]* ...

  8. set总结

    set 定义 列表的特性: 可修改 无序 不重复 列表的创建: ​ 1.直接创建; s = {'a', 1, 'c'} ​ 2.set() 创建一个空set; s = set() ​ 3.set(it ...

  9. Springboot 使用JPA

    Springboot 使用jpa maven依赖 <dependency> <groupId>org.springframework.boot</groupId> ...

  10. js+jq 淡入淡出轮播(点击+定时+鼠标进入移出事件)

    <!DOCTYPE html><html> <head> <meta charset="utf-8" /> <title> ...