力扣刷题记录——190. 颠倒二进制位、191. 位1的个数、202. 快乐数

简介: 力扣刷题记录——190. 颠倒二进制位、191. 位1的个数、202. 快乐数

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


相关文章
|
2月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
3月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
54 6
|
3月前
|
Python
【Leetcode刷题Python】剑指 Offer 26. 树的子结构
这篇文章提供了解决LeetCode上"剑指Offer 26. 树的子结构"问题的Python代码实现和解析,判断一棵树B是否是另一棵树A的子结构。
46 4
|
3月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
107 2
|
9天前
|
机器学习/深度学习 人工智能 自然语言处理
280页PDF,全方位评估OpenAI o1,Leetcode刷题准确率竟这么高
【10月更文挑战第24天】近年来,OpenAI的o1模型在大型语言模型(LLMs)中脱颖而出,展现出卓越的推理能力和知识整合能力。基于Transformer架构,o1模型采用了链式思维和强化学习等先进技术,显著提升了其在编程竞赛、医学影像报告生成、数学问题解决、自然语言推理和芯片设计等领域的表现。本文将全面评估o1模型的性能及其对AI研究和应用的潜在影响。
10 1
|
2月前
|
数据采集 负载均衡 安全
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
本文提供了多个多线程编程问题的解决方案,包括设计有限阻塞队列、多线程网页爬虫、红绿灯路口等,每个问题都给出了至少一种实现方法,涵盖了互斥锁、条件变量、信号量等线程同步机制的使用。
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
|
3月前
|
算法 Java
LeetCode第67题二进制求和
这篇文章是关于LeetCode第67题二进制求和的解题思路和代码实现的分享。作者通过分析题目要求和二进制加法的规则,提供了一个Java语言的解决方案,并在最后总结了二进制在算法中的重要性。
LeetCode第67题二进制求和
|
3月前
|
索引 Python
【Leetcode刷题Python】从列表list中创建一颗二叉树
本文介绍了如何使用Python递归函数从列表中创建二叉树,其中每个节点的左右子节点索引分别是当前节点索引的2倍加1和2倍加2。
54 7
|
3月前
|
Python
【Leetcode刷题Python】剑指 Offer 30. 包含min函数的栈
本文提供了实现一个包含min函数的栈的Python代码,确保min、push和pop操作的时间复杂度为O(1)。
25 4
|
3月前
|
Python
【Leetcode刷题Python】剑指 Offer 22. 链表中倒数第k个节点
Leetcode题目"剑指 Offer 22. 链表中倒数第k个节点"的Python解决方案,使用双指针法找到并返回链表中倒数第k个节点。
50 5