由于python的整形位数和平台有关,而且有自动提升的机制,所以不适合做这类题目。
这篇随笔中大部分题目都是用java实现的,感觉自己java常用的方法还是不熟悉。
-------------------------------------------------------------------
365.二进制求和
给定两个二进制字符串,返回他们的和(用二进制表示)。
输入是字符串的话,py还是有优势的。
class Solution: # @param {string} a a number # @param {string} b a number # @return {string} the result def addBinary(self, a, b): # Write your code here result = ['0'] * (max(len(a), len(b)) + 1) s = c = False i = 1 while i < len(a) + 1 and i < len(b) + 1: s = (not c and (a[-i] != b[-i])) or (c and (a[-i] == b[-i])) if s: result[-i] = '1' c = (a[-i] == '1' and b[-i] == '1') or (c and (a[-i] != b[-i])) i += 1 while i < len(a) + 1: s = (not c and a[-i] == '1') or (c and a[-i] == '0') if s: result[-i] = '1' c = a[-i] == '1' and c i += 1 while i < len(b) + 1: s = (not c and b[-i] == '1') or (c and b[-i] == '0') if s: result[-i] = '1' c = b[-i] == '1' and c i += 1 if c: result[-i] = '1' return ''.join(result[1:] if result and result[0] == '0' else result)
-------------------------------------------------------------------
408.二进制中有多少个1
计算在一个 32 位的整数的二进制表式中有多少个 1
.
使用无符号右移>>>。
public class Solution { /** * @param num: an integer * @return: an integer, the number of ones in num */ public int countOnes(int num) { // write your code here int result = 0; while(num != 0){ if((num & 1) > 0){ result++; } num = num >>> 1; } return result; } };
-------------------------------------------------------------------
411.格雷编码
给定一个非负整数 n
,表示该代码中所有二进制的总数,请找出其格雷编码顺序。
循环版本实在是有点绕,说不定递归的简单点。
class Solution: # @param {int} n a number # @return {int[]} Gray code def grayCode(self, n): # Write your code here if n == 0: return [0] result = [] for i in range(2 ** n): bin_i = ['0'] * n temp = i for j in xrange(n): if temp < 2 ** (n - j) and temp >= 2 ** (n - j - 1): bin_i[j] = '1' if temp >= 2 ** (n - j) and temp < 2 ** (n - j) + 2 ** (n - j - 1): bin_i[j] = '1' if temp >= 2 ** (n - j): temp -= 2 ** (n - j) result.append(''.join(bin_i)) return [int(r, 2) for r in result]
-------------------------------------------------------------------
1.A + B 问题
给出两个整数a和b, 求他们的和, 但不能使用 +
等数学运算符。
思路和二进制加法一样,专门实现了一个函数用来检测数字的某一位是1还是0.
class Solution { /* * param a: The first integer * param b: The second integer * return: The sum of a and b */ public int aplusb(int a, int b) { // write your code here, try to do it without arithmetic operators. int res = 0; boolean s = false; boolean c = false; for(int i = 0; i < 32; i++){ s = (testBit(a, i) == testBit(b, i)) ^ (!c); if(s){ res += 1 << i; } c = ((testBit(a, i) == 1 && testBit(b, i) == 1) || (c && (testBit(a, i) != testBit(b, i)))); } return res; } public int testBit(int a, int index){ int shift = 1 << index; return ((a & shift) != 0) ? 1 : 0; } };
-------------------------------------------------------------------
142.O(1)时间检测2的幂次
用 O(1) 时间检测整数 n 是否是 2 的幂次。
class Solution: """ @param n: An integer @return: True or false """ def checkPowerOf2(self, n): # write your code here if n <= 0: return False return bin(n).count('1') == 1
-------------------------------------------------------------------
179.更新二进制位
给出两个32位的整数N和M,以及两个二进制位的位置i和j。写一个方法来使得N中的第i到j位等于M(M会是N中从第i为开始到第j位的子串)
先将n中i~j范围置0,然后将m左移位i,之后n+=m。
class Solution { /** *@param n, m: Two integer *@param i, j: Two bit positions *return: An integer */ public int updateBits(int n, int m, int i, int j) { // write your code here int low = 0; for(int x = 0; x < i; x++){ low = (low << 1) + 1; } int high = 0; if(j < 31){ high = -1 << j + 1; } else{ high = 0; } n = n & (high + low); n += m << i; return n; } }
-------------------------------------------------------------------
180.二进制表示
给定一个数将其转换为二进制(均用字符串表示),如果这个数的小数部分不能在 32 个字符之内来精确地表示,则返回 "ERROR"
。
小数点前的用Integer.toBinaryString直接转,后面使用基数连乘法,最后一起输出。
public class Solution { /** *@param n: Given a decimal number that is passed in as a string *@return: A string */ public String binaryRepresentation(String n) { // write your code here if(n == null || n == "" || n.charAt(0) == '-'){ return "ERROR"; } try{ String result = ""; result = Integer.toBinaryString( Integer.parseInt(n.split("\.")[0]) ) + "."; double target = Double.parseDouble( "0." + n.split("\.")[1] ); String result1 = ""; while(result1.length() <= 32 && target - 0 > 1e-10){ target = target * 2; if(target >= 1){ result1 += "1"; target -= 1; } else{ result1 += "0"; } } result += result1; if(result1.length() <= 32){ return (result.split("\.").length > 1)? result : result.split("\.")[0]; } return "ERROR"; } catch(Exception e){ return "ERROR"; } } }
-------------------------------------------------------------------
181.将整数A转换为B
如果要将整数A转换为B,需要改变多少个bit位?
class Solution: """ @param a, b: Two integer return: An integer """ def bitSwapRequired(self, a, b): # write your code here return bin(a ^ b).count('1')