这是小川的第377次更新,第404篇原创
java
今天介绍的是LeetCode算法题中Easy级别的第238题(顺位题号是1009)。每一个非负整数N都具备二进制表示。例如,5能够二进制表示为"101"
,11能够二进制表示为"1011"
,依此类推。算法
请注意,除N = 0
外,任何二进制表示中都没有前导零。数据结构
二进制表示的补码是将1改成0和将0改成1时获得的二进制数。例如,二进制中"101"
的补码是二进制的"010"
。app
对于给定的十进制数N
,将其二进制表示的补码做为十进制的整数返回。ui
例如:code
输入:5
输出:2
说明:5是二进制"101"
,二进制补码"010"
,转为十进制是2。字符串
输入:7
输出:0
说明:7是二进制"111"
,二进制补码"000"
,转为十进制是0。string
输入:10
输出:5
说明:10是二进制"1010"
,二进制补码"0101"
,转为十进制是5。it
注意:class
题目的意思是将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; }
思路:将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); }
思路和第一种解法相似,只是换了另外的方式来获得全是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); }
算法专题目前已连续日更超过七个月,算法题文章244+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。
以上就是所有内容,若是你们有什么好的解法思路、建议或者其余问题,能够下方留言交流,好看、留言、转发就是对我最大的回报和支持!