¶剑指offer – 位运算
¶剑指 Offer 15. 二进制中1的个数
Difficulty: 简单
请实现一个函数,输入一个整数(以二进制串形式),输出该数二进制表示中 1 的个数。例如,把 9 表示成二进制是 1001,有 2 位是 1。因此,如果输入 9,则该函数输出 2。
示例 1:
1 | 输入:00000000000000000000000000001011 |
示例 2:
1 | 输入:00000000000000000000000010000000 |
示例 3:
1 | 输入:11111111111111111111111111111101 |
提示:
- 输入必须是长度为
32
的 二进制串 。
Solution
方法一:逐位运算
1 | class Solution { |
时间复杂度: $O(log_2n)$
空间复杂度: $O(1)$
方法二:n & n - 1
1 | class Solution { |
时间复杂度: $O(M)$ ,M 为二进制数字 n 中 1 的个数
空间复杂度: $O(1)$
¶剑指 Offer 56 - I. 数组中数字出现的次数
Difficulty: 中等
一个整型数组 nums
里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。
示例 1:
1 | 输入:nums = [4,1,4,6] |
示例 2:
1 | 输入:nums = [1,2,10,4,1,4,3,3] |
限制:
2 <= nums.length <= 10000
Solution
1 | class Solution { |
时间复杂度: $O(N)$
空间复杂度: $O(1)$
¶剑指 Offer 56 - II. 数组中数字出现的次数 II
Difficulty: 中等
在一个数组 nums
中除一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字。
示例 1:
1 | 输入:nums = [3,4,3,3] |
示例 2:
1 | 输入:nums = [9,1,7,9,7,9,7] |
限制:
1 <= nums.length <= 10000
1 <= nums[i] < 2^31
Solution
方法一:哈希表
1 | class Solution { |
时间复杂度: $O(N)$,遍历一次数组,一次哈希表即可,$O(N + (N - 1) / 3 + 1) \approx O(N)$。
空间复杂度: $O(N)$,哈希表需要空间 $O((N - 1) / 3 + 1) \approx O(N)$。
方法二:遍历统计,该方法可以通用 m > 1 的所有情况
1 | class Solution { |
时间复杂度: $O(N)$
空间复杂度: $O(1)$
方法三:有限状态机,数字电路方法
1 | class Solution { |
优化方式:只出现一次的数字 II
时间复杂度: $O(N)$
空间复杂度: $O(1)$
¶剑指 Offer 65. 不用加减乘除做加法
Difficulty: 简单
写一个函数,求两个整数之和,要求在函数体内不得使用 “+”、“-”、“*”、“/” 四则运算符号。
示例:
1 | 输入: a = 1, b = 1 |
提示:
a
,b
均可能是负数或 0- 结果不会溢出 32 位整数
Solution
1 | class Solution { |
时间复杂度: $O(1)$,最大情况 32 次循环
空间复杂度: $O(1)$
¶参考资料
图解算法数据结构 - LeetBook - 力扣(LeetCode)全球极客挚爱的技术成长平台 (leetcode-cn.com)