190. 颠倒二进制位
题目描述
颠倒给定的 32 位无符号整数的二进制位。
示例一:
输入:n = 00000010100101000001111010011100
输出:964176192 (00111001011110000010100101000000)
解释:输入的二进制串 00000010100101000001111010011100 表示无符号整数 43261596,
因此返回 964176192,其二进制表示形式为 00111001011110000010100101000000。
示例二:
输入:n = 11111111111111111111111111111101
输出:3221225471 (10111111111111111111111111111111)
解释:输入的二进制串 11111111111111111111111111111101 表示无符号整数 4294967293,
因此返回 3221225471 其二进制表示形式为 10111111111111111111111111111111
解题思路
题目给的是说n是一个32位的字符串,但是提示代码给的是一个整数,有点矛盾,我这里就按照整数来处理了。这一题可以分为两步走,第一步将整数进行翻转,第二步将二进制整数转化为十进制整数输出就可以了。
解题过程
按照上面的思路,我们用列表和字符串的方法将整个整数进行翻转,然后按照二进制转十进制的方式定义一个result变量进行累加就可以了。代码如下:
1. def reverseBits( n: int): 2. target_list = [] 3. for i in str(n): 4. target_list.append(i) 5. target_list = target_list[::-1] 6. fin_num = "".join(target_list) 7. result = 0 8. for i in range(len(fin_num)-1,-1,-1): 9. result += int(fin_num[len(fin_num)-i-1])*2**i 10. return result 11. 12. print(reverseBits(11111111111111111111111111111101)) 13. #输出结果为:3221225471
奇怪的是,这个代码在我本地的pycharm里面可以很好的运行,测试了好几个测试集都能够给出正确答案,但是在力扣上就会报错
经过长时间的摸索发现,力扣给的整数不是真正意义上的整数,需要用bin函数进行接收,可以理解成,给的是一个十进制的数字,需要先转成二进制才能进行操作,所有我们需要先用bin转化:
1. 2. class Solution: 3. def reverseBits(self, n: int) -> int: 4. target_list = [] 5. for i in bin(n): 6. target_list.append(i) 7. print(len(target_list)) 8. target_list = target_list[2::] 9. target_list = target_list[::-1] 10. fin_num = "".join(target_list) 11. for i in range(0,32-len(fin_num)): 12. fin_num += "0" 13. fin_num = "0b" + fin_num 14. return int(fin_num,2)
主要要加上0b和末尾补零,题目给了是32位,所以根据数字进行补零就可以了 ,执行一下,顺利通关:
191. 位1的个数
题目描述
编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 '1' 的个数(也被称为汉明重量)。
编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 '1' 的个数(也被称为汉明重量)。
解题思路
有了上一题的探索,这一题就很好解决了,主要定义一个count计数器,是1就进行+1就可以。
解题代码
1. def hammingWeight(n: int): 2. count = 0 3. for i in bin(n): 4. print(i) 5. if i == "1": 6. count += 1 7. return count
202. 快乐数
题目描述
编写一个算法来判断一个数
n
是不是快乐数。「快乐数」 定义为:
- 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
- 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
- 如果这个过程 结果为 1,那么这个数就是快乐数。
如果
n
是 快乐数 就返回true
;不是,则返回false
。示例 1:
输入:n = 19
输出:true
解释:
12 + 92 = 82
82 + 22 = 68
62 + 82 = 100
12 + 02 + 02 = 1
解题思路
看到一个关键词——“重复”,那么不是用递归就是用while循环了,不知道为什么,我在力扣里面用递归 提示这个函数没定义,还是放弃递归这个办法,虽然它很优美。所有重复这部分我准备用while循环来做,每个位置的数字平方和可以换成字符串用切片来做,这样更方便一点。如果无限循环,说明这个数之前肯定出现过了,所以用一个列表来存储每一次出现的数字,之后每出现一个新的数字就判断一下这个数字是否在之前出现过,如果出现过说明无限循环了,返回True。
解题代码
1. def isHappy(n: int): 2. if n == 1: 3. return True 4. mask_list = [] 5. while True: 6. mask_list.append(n) 7. if n < 10: 8. return False 9. all = 0 10. for i in str(n): 11. # print(i) 12. all += int(i)**2 13. if all in mask_list: 14. return True 15. n = all 16. # print(n) 17. if all == 1: 18. return True