位运算
从零开始的数据猿
这个作者很懒,什么都没留下…
展开
-
LeetCode 461. 汉明距离
题目两个整数之间的 汉明距离 指的是这两个数字对应二进制位不同的位置的数目。给你两个整数 x 和 y,计算并返回它们之间的汉明距离。 示例 1:输入:x = 1, y = 4输出:2解释:1 (0 0 0 1)4 (0 1 0 0) ↑ ↑上面的箭头指出了对应二进制位不同的位置。示例 2:输入:x = 3, y = 1输出:1 提示:0 <= x, y <= 231 - 1解题思路位运算代码class Soluti原创 2021-06-20 00:06:40 · 93 阅读 · 0 评论 -
面试题 05.01. 插入
题目给定两个整型数字 N 与 M,以及表示比特位置的 i 与 j(i <= j,且从 0 位开始计算)。编写一种方法,使 M 对应的二进制数字插入 N 对应的二进制数字的第 i ~ j 位区域,不足之处用 0 补齐。具体插入过程如图所示。题目保证从 i 位到 j 位足以容纳 M, 例如: M = 10011,则 i~j 区域至少可容纳 5 位。 示例1: 输入:N = 1024(10000000000), M = 19(10011), i = 2, j = 6 输出:N =原创 2021-06-20 00:05:46 · 155 阅读 · 0 评论 -
LeetCode 693. 交替位二进制数
题目给定一个正整数,检查它的二进制表示是否总是 0、1 交替出现:换句话说,就是二进制表示中相邻两位的数字永不相同。 示例 1:输入:n = 5输出:true解释:5 的二进制表示是:101示例 2:输入:n = 7输出:false解释:7 的二进制表示是:111.示例 3:输入:n = 11输出:false解释:11 的二进制表示是:1011.示例 4:输入:n = 10输出:true解释:10 的二进制表示是:1010.示例 5:输入:n = 3输原创 2021-06-20 00:06:52 · 155 阅读 · 4 评论 -
LeetCode 762. 二进制表示中质数个计算置位
题目给定两个整数 L 和 R ,找到闭区间 [L, R] 范围内,计算置位位数为质数的整数个数。(注意,计算置位代表二进制表示中1的个数。例如 21 的二进制表示 10101 有 3 个计算置位。还有,1 不是质数。)示例 1:输入: L = 6, R = 10输出: 4解释:6 -> 110 (2 个计算置位,2 是质数)7 -> 111 (3 个计算置位,3 是质数)9 -> 1001 (2 个计算置位,2 是质数)10-> 1010 (2 个计算置位,原创 2021-06-19 12:21:34 · 148 阅读 · 0 评论 -
LeetCode 1290. 二进制链表转整数
题目给你一个单链表的引用结点 head。链表中每个结点的值不是 0 就是 1。已知此链表是一个整数数字的二进制表示形式。请你返回该链表所表示数字的 十进制值 。示例 1:输入:head = [1,0,1]输出:5解释:二进制数 (101) 转化为十进制数 (5)示例 2:输入:head = [0]输出:0示例 3:输入:head = [1]输出:1示例 4:输入:head = [1,0,0,1,0,0,1,1,1,0,0,0,0,0,0]输出:18880示例 5:输入:h原创 2021-06-19 12:19:24 · 119 阅读 · 0 评论 -
LeetCode 1342. 将数字变成 0 的操作次数
题目给你一个非负整数 num ,请你返回将它变成 0 所需要的步数。 如果当前数字是偶数,你需要把它除以 2 ;否则,减去 1 。 示例 1:输入:num = 14输出:6解释:步骤 1) 14 是偶数,除以 2 得到 7 。步骤 2) 7 是奇数,减 1 得到 6 。步骤 3) 6 是偶数,除以 2 得到 3 。步骤 4) 3 是奇数,减 1 得到 2 。步骤 5) 2 是偶数,除以 2 得到 1 。步骤 6) 1 是奇数,减 1 得到 0 。示例 2:输入:num =原创 2021-06-19 12:18:15 · 71 阅读 · 0 评论 -
LeetCode 1356. 根据数字二进制下 1 的数目排序
题目给你一个整数数组 arr 。请你将数组中的元素按照其二进制表示中数字 1 的数目升序排序。如果存在多个数字二进制中 1 的数目相同,则必须将它们按照数值大小升序排列。请你返回排序后的数组。 示例 1:输入:arr = [0,1,2,3,4,5,6,7,8]输出:[0,1,2,4,8,3,5,6,7]解释:[0] 是唯一一个有 0 个 1 的数。[1,2,4,8] 都有 1 个 1 。[3,5,6] 有 2 个 1 。[7] 有 3 个 1 。按照 1 的个数排序得到的结原创 2021-06-19 12:17:30 · 89 阅读 · 0 评论 -
LeetCode 1837. K 进制表示下的各位数字总和
题目给你一个整数 n(10 进制)和一个基数 k ,请你将 n 从 10 进制表示转换为 k 进制表示,计算并返回转换后各位数字的 总和 。转换后,各位数字应当视作是 10 进制数字,且它们的总和也应当按 10 进制表示返回。 示例 1:输入:n = 34, k = 6输出:9解释:34 (10 进制) 在 6 进制下表示为 54 。5 + 4 = 9 。示例 2:输入:n = 10, k = 10输出:1解释:n 本身就是 10 进制。 1 + 0 = 1 。 提示:原创 2021-06-19 12:16:14 · 332 阅读 · 0 评论 -
LeetCode 1720. 解码异或后的数组
题目未知 整数数组 arr 由 n 个非负整数组成。经编码后变为长度为 n - 1 的另一个整数数组 encoded ,其中 encoded[i] = arr[i] XOR arr[i + 1] 。例如,arr = [1,0,2,1] 经编码后得到 encoded = [1,2,3] 。给你编码后的数组 encoded 和原数组 arr 的第一个元素 first(arr[0])。请解码返回原数组 arr 。可以证明答案存在并且是唯一的。 示例 1:输入:encoded = [1,2原创 2021-06-19 12:15:21 · 146 阅读 · 0 评论 -
LeetCode 1486. 数组异或操作
题目给你两个整数,n 和 start 。数组 nums 定义为:nums[i] = start + 2*i(下标从 0 开始)且 n == nums.length 。请返回 nums 中所有元素按位异或(XOR)后得到的结果。 示例 1:输入:n = 5, start = 0输出:8解释:数组 nums 为 [0, 2, 4, 6, 8],其中 (0 ^ 2 ^ 4 ^ 6 ^ 8) = 8 。 "^" 为按位异或 XOR 运算符。示例 2:输入:n = 4, st原创 2021-06-19 12:13:25 · 157 阅读 · 0 评论 -
LeetCode 389. 找不同
题目给定两个字符串 s 和 t,它们只包含小写字母。字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。请找出在 t 中被添加的字母。 示例 1:输入:s = "abcd", t = "abcde"输出:"e"解释:'e' 是那个被添加的字母。示例 2:输入:s = "", t = "y"输出:"y"示例 3:输入:s = "a", t = "aa"输出:"a"示例 4:输入:s = "ae", t = "aea"输出:"a" 提示:0原创 2021-06-19 06:34:08 · 121 阅读 · 0 评论 -
LeetCode 136. 只出现一次的数字
题目给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。说明:你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?示例 1:输入: [2,2,1]输出: 1示例 2:输入: [4,1,2,1,2]输出: 4解题思路位运算代码class Solution { public int singleNumber(int[] nums) { int single = 0; for原创 2021-06-19 06:33:46 · 113 阅读 · 0 评论 -
LeetCode 401. 二进制手表
题目二进制手表顶部有 4 个 LED 代表 小时(0-11),底部的 6 个 LED 代表 分钟(0-59)。每个 LED 代表一个 0 或 1,最低位在右侧。例如,下面的二进制手表读取 "3:25" 。(图源:WikiMedia - Binary clock samui moon.jpg ,许可协议:Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) )给你一个整数 turnedOn ,表示当前亮着的 LED 的数量,返回二进制手表可以表示原创 2021-06-19 06:33:25 · 249 阅读 · 0 评论 -
LeetCode 342. 4的幂
题目给定一个整数,写一个函数来判断它是否是 4 的幂次方。如果是,返回 true ;否则,返回 false 。整数 n 是 4 的幂次方需满足:存在整数 x 使得 n == 4x 示例 1:输入:n = 16输出:true示例 2:输入:n = 5输出:false示例 3:输入:n = 1输出:true 提示:-231 <= n <= 231 - 1 进阶:你能不使用循环或者递归来完成本题吗?解题思路位运算代码class Solu原创 2021-06-18 11:23:15 · 64 阅读 · 0 评论 -
LeetCode 405. 数字转换为十六进制数
题目给定一个整数,编写一个算法将这个数转换为十六进制数。对于负整数,我们通常使用 补码运算 方法。注意:十六进制中所有字母(a-f)都必须是小写。十六进制字符串中不能包含多余的前导零。如果要转化的数为0,那么以单个字符'0'来表示;对于其他情况,十六进制字符串中的第一个字符将不会是0字符。 给定的数确保在32位有符号整数范围内。不能使用任何由库提供的将数字直接转换或格式化为十六进制的方法。示例 1:输入:26输出:"1a"示例 2:输入:-1输出:"fffffff原创 2021-06-18 11:22:16 · 159 阅读 · 0 评论 -
LeetCode 476. 数字的补数
题目给你一个 正 整数 num ,输出它的补数。补数是对该数的二进制表示取反。 示例 1:输入:num = 5输出:2解释:5 的二进制表示为 101(没有前导零位),其补数为 010。所以你需要输出 2 。示例 2:输入:num = 1输出:0解释:1 的二进制表示为 1(没有前导零位),其补数为 0。所以你需要输出 0 。 提示:给定的整数 num 保证在 32 位带符号整数的范围内。num >= 1你可以假定二进制数不包含前导零位。解题思路位运算原创 2021-06-18 11:21:13 · 159 阅读 · 0 评论 -
LeetCode 191. 位1的个数
题目编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 '1' 的个数(也被称为汉明重量)。 提示:请注意,在某些语言(如 Java)中,没有无符号整数类型。在这种情况下,输入和输出都将被指定为有符号整数类型,并且不应影响您的实现,因为无论整数是有符号的还是无符号的,其内部的二进制表示形式都是相同的。在 Java 中,编译器使用二进制补码记法来表示有符号整数。因此,在上面的 示例 3 中,输入表示有符号整数 -3。 示例 1:输入:0000000原创 2021-06-18 08:35:29 · 115 阅读 · 0 评论 -
LeetCode 231. 2 的幂
题目给你一个整数 n,请你判断该整数是否是 2 的幂次方。如果是,返回 true ;否则,返回 false 。如果存在一个整数 x 使得 n == 2x ,则认为 n 是 2 的幂次方。 示例 1:输入:n = 1输出:true解释:20 = 1示例 2:输入:n = 16输出:true解释:24 = 16示例 3:输入:n = 3输出:false示例 4:输入:n = 4输出:true示例 5:输入:n = 5输出:false 提示:-23原创 2021-06-18 08:34:05 · 140 阅读 · 0 评论 -
LeetCode 268. 丢失的数字
题目给定一个包含 [0, n] 中 n 个数的数组 nums ,找出 [0, n] 这个范围内没有出现在数组中的那个数。 进阶:你能否实现线性时间复杂度、仅使用额外常数空间的算法解决此问题? 示例 1:输入:nums = [3,0,1]输出:2解释:n = 3,因为有 3 个数字,所以所有的数字都在范围 [0,3] 内。2 是丢失的数字,因为它没有出现在 nums 中。示例 2:输入:nums = [0,1]输出:2解释:n = 2,因为有 2 个数字,所以所有的数字都原创 2021-06-18 08:32:51 · 102 阅读 · 0 评论 -
LeetCode 190. 颠倒二进制位
题目颠倒给定的 32 位无符号整数的二进制位。 提示:请注意,在某些语言(如 Java)中,没有无符号整数类型。在这种情况下,输入和输出都将被指定为有符号整数类型,并且不应影响您的实现,因为无论整数是有符号的还是无符号的,其内部的二进制表示形式都是相同的。在 Java 中,编译器使用二进制补码记法来表示有符号整数。因此,在上面的 示例 2 中,输入表示有符号整数 -3,输出表示有符号整数 -1073741825。 进阶:如果多次调用这个函数,你将如何优化你的算法? 示例 1:原创 2021-06-18 08:31:52 · 90 阅读 · 0 评论 -
LeetCode 338. 比特位计数
题目给定一个非负整数 num。对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将它们作为数组返回。示例 1:输入: 2输出: [0,1,1]示例 2:输入: 5输出: [0,1,1,2,1,2]进阶:给出时间复杂度为O(n*sizeof(integer))的解答非常容易。但你可以在线性时间O(n)内用一趟扫描做到吗?要求算法的空间复杂度为O(n)。你能进一步完善解法吗?要求在C++或任何其他语言中不使用任何内置函数(如 C++ 中的 __b原创 2021-06-18 08:25:18 · 100 阅读 · 0 评论 -
LeetCode 169. 多数元素
题目给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。 示例 1:输入:[3,2,3]输出:3示例 2:输入:[2,2,1,1,1,2,2]输出:2 进阶:尝试设计时间复杂度为 O(n)、空间复杂度为 O(1) 的算法解决此问题。解题思路位运算代码class Solution { public int majorityElement(in原创 2021-06-18 08:18:00 · 71 阅读 · 0 评论 -
Java 位运算小结
文章目录Java位运算符左移和右移应用场景-奇偶判断应用场景-两数交换Java位运算符&与:两个二进制位只要有一个为0那么结果就为0,否则结果为1。|或:两个二进制位只要有一个为1那么结果就为1,否则结果为0。^异或:任何相同二进制位进行 ^ 运算,结果是0;不相同二进制位 ^ 运算结果是1。~取反:0变1,1变0举个????:public class OperatorDemo9 { public static void main(String[] args) throws原创 2021-06-17 11:43:32 · 128 阅读 · 1 评论