![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
java位运算符
惠菁
我见过大海,看过繁星,但唯独遇见你,是我长久以来,所有奔赴的意义。
展开
-
【Java|golang】2103. 环和杆---位运算
总计有 n 个环,环的颜色可以是红、绿、蓝中的一种。这些环分别穿在 10 根编号为 0 到 9 的杆上。给你一个长度为 2n 的字符串 rings ,表示这 n 个环在杆上的分布。rings 中每两个字符形成一个 颜色位置对 ,用于描述每个环:第 i 对中的 第一个 字符表示第 i 个环的 颜色('R'、'G'、'B')。第 i 对中的 第二个 字符表示第 i 个环的 位置,也就是位于哪根杆上('0' 到 '9')。例如,"R3G2B1" 表示:共有 n == 3 个环,红色的环在编号为 3 的原创 2023-11-02 19:55:48 · 303 阅读 · 0 评论 -
【Java|golang】1017. 负二进制转换
给你一个整数 n ,以二进制字符串的形式返回该整数的 负二进制(base -2)表示。注意,除非字符串就是 "0",否则返回的字符串中不能含有前导零。原创 2023-04-06 18:15:00 · 537 阅读 · 0 评论 -
【Java|golang】 1238. 循环码排列---格雷编码
给你两个整数 n 和 start。你的任务是返回任意 (0,1,2,,...,2^n-1) 的排列 p,并且满足:p[0] = startp[i] 和 p[i+1] 的二进制表示形式只有一位不同p[0] 和 p[2^n -1] 的二进制表示形式也只有一位不同原创 2023-02-23 18:30:00 · 251 阅读 · 0 评论 -
【java|golang】1758. 生成交替二进制字符串的最少操作数
给你一个仅由字符 '0' 和 '1' 组成的字符串 s 。一步操作中,你可以将任一 '0' 变成 '1' ,或者将 '1' 变成 '0' 。原创 2022-11-29 13:36:58 · 304 阅读 · 0 评论 -
【Java】1700. 无法吃午餐的学生数量
学校的自助午餐提供圆形和方形的三明治,分别用数字 0 和 1 表示。所有学生站在一个队列里,每个学生要么喜欢圆形的要么喜欢方形的。原创 2022-10-19 10:08:12 · 131 阅读 · 0 评论 -
【Java】769. 最多能完成排序的块
给定一个长度为 n 的整数数组 arr ,它表示在 [0, n - 1] 范围内的整数的排列。原创 2022-10-13 13:55:04 · 313 阅读 · 0 评论 -
【Java|golang】693. 交替位二进制数---使用位运算符,两行代码。
给定一个正整数,检查它的二进制表示是否总是 0、1 交替出现:换句话说,就是二进制表示中相邻两位的数字永不相同。示例 1:输入:n = 5输出:true解释:5 的二进制表示是:101示例 2:输入:n = 7输出:false解释:7 的二进制表示是:111.示例 3:输入:n = 11输出:false解释:11 的二进制表示是:1011.提示:1 <= n <= 231 - 1public boolean hasAlternatingBits(int n) {原创 2022-03-28 13:53:13 · 343 阅读 · 0 评论 -
【Java】540. 有序数组中的单一元素---使用位运算或两两比较相同方法,时间复杂度O(N)
给你一个仅由整数组成的有序数组,其中每个元素都会出现两次,唯有一个数只会出现一次。请你找出并返回只出现一次的那个数。你设计的解决方案必须满足 O(log n) 时间复杂度和 O(1) 空间复杂度。示例 1:输入: nums = [1,1,2,3,3,4,4,8,8]输出: 2示例 2:输入: nums = [3,3,7,7,10,11,11]输出: 10提示:1 <= nums.length <= 1050 <= nums[i] <= 105方法1:pub原创 2022-02-16 09:25:39 · 257 阅读 · 0 评论 -
【Java】397. 整数替换---使用位运算,超详细讲解,不适用递归。
给定一个正整数 n ,你可以做如下操作:如果 n 是偶数,则用 n / 2替换 n 。如果 n 是奇数,则可以用 n + 1或n - 1替换 n 。n 变为 1 所需的最小替换次数是多少?示例 1:输入:n = 8输出:3解释:8 -> 4 -> 2 -> 1示例 2:输入:n = 7输出:4解释:7 -> 8 -> 4 -> 2 -> 1或 7 -> 6 -> 3 -> 2 -> 1示例 3:输入:n = 4输原创 2021-11-19 09:32:03 · 497 阅读 · 0 评论 -
【Java】476. 数字的补数---先用二进制移位,找到与目标数二进制等长全用1填充的二进制,然后使用异或运算。
对整数的二进制表示取反(0 变 1 ,1 变 0)后,再转换为十进制表示,可以得到这个整数的补数。例如,整数 5 的二进制表示是 “101” ,取反后得到 “010” ,再转回十进制表示得到补数 2 。给你一个整数 num ,输出它的补数。示例 1:输入:num = 5输出:2解释:5 的二进制表示为 101(没有前导零位),其补数为 010。所以你需要输出 2 。示例 2:输入:num = 1输出:0解释:1 的二进制表示为 1(没有前导零位),其补数为 0。所以你需要输出 0 。提原创 2021-10-29 14:32:32 · 80 阅读 · 0 评论 -
【Java】405. 数字转换为十六进制数---使用运算符&和向右移位>>,快速解决问题!!!
给定一个整数,编写一个算法将这个数转换为十六进制数。对于负整数,我们通常使用 补码运算 方法。注意:十六进制中所有字母(a-f)都必须是小写。十六进制字符串中不能包含多余的前导零。如果要转化的数为0,那么以单个字符’0’来表示;对于其他情况,十六进制字符串中的第一个字符将不会是0字符。给定的数确保在32位有符号整数范围内。不能使用任何由库提供的将数字直接转换或格式化为十六进制的方法。示例 1:输入:26输出:“1a”示例 2:输入:-1输出:“ffffffff”代码:pub原创 2021-10-11 14:08:18 · 124 阅读 · 0 评论 -
【Java】剑指 Offer 15. 二进制中1的个数---采用两种方法计算,使用位运算或Integer包装类方法!!!
请实现一个函数,输入一个整数(以二进制串形式),输出该数二进制表示中 1 的个数。例如,把 9 表示成二进制是 1001,有 2 位是 1。因此,如果输入 9,则该函数输出 2。示例 1:输入:00000000000000000000000000001011输出:3解释:输入的二进制串 00000000000000000000000000001011 中,共有三位为 ‘1’。示例 2:输入:00000000000000000000000010000000输出:1解释:输入的二进制串 0000原创 2021-06-23 10:42:25 · 82 阅读 · 0 评论 -
【Java】401. 二进制手表---使用String的format,注意格式化小细节!!!
二进制手表顶部有 4 个 LED 代表 小时(0-11),底部的 6 个 LED 代表 分钟(0-59)。每个 LED 代表一个 0 或 1,最低位在右侧。给你一个整数 turnedOn ,表示当前亮着的 LED 的数量,返回二进制手表可以表示的所有可能时间。你可以 按任意顺序 返回答案。小时不会以零开头:例如,“01:00” 是无效的时间,正确的写法应该是 “1:00” 。分钟必须由两位数组成,可能会以零开头:例如,“10:2” 是无效的时间,正确的写法应该是 “10:02” 。示例 1:输原创 2021-06-21 09:54:14 · 325 阅读 · 0 评论 -
【Java】483. 最小好进制---注意大数的取值范围,使用BigInteger处理较大的数!!!
对于给定的整数 n, 如果n的k(k>=2)进制数的所有数位全为1,则称 k(k>=2)是 n 的一个好进制。以字符串的形式给出 n, 以字符串的形式返回 n 的最小好进制。示例 1:输入:“13”输出:“3”解释:13 的 3 进制是 111。示例 2:输入:“4681”输出:“8”解释:4681 的 8 进制是 11111。示例 3:输入:“1000000000000000000”输出:“999999999999999999”解释:10000000000000000原创 2021-06-18 15:55:52 · 230 阅读 · 0 评论 -
【Java】67. 二进制求和---时间复杂度O(N),使用Stringbuffer解决不定长字符串!!!
给你两个二进制字符串,返回它们的和(用二进制表示)。输入为 非空 字符串且只包含数字 1 和 0。示例 1:输入: a = “11”, b = “1”输出: “100”示例 2:输入: a = “1010”, b = “1011”输出: “10101”提示:每个字符串仅由字符 ‘0’ 或 ‘1’ 组成。1 <= a.length, b.length <= 10^4字符串如果不是 “0” ,就都不含前导零。代码:public String addBinary(String原创 2021-06-09 09:28:13 · 91 阅读 · 0 评论 -
【Java】342. 4的幂---时间复杂度O(1)!!!
给定一个整数,写一个函数来判断它是否是 4 的幂次方。如果是,返回 true ;否则,返回 false 。整数 n 是 4 的幂次方需满足:存在整数 x 使得 n == 4x示例 1:输入:n = 16输出:true示例 2:输入:n = 5输出:false示例 3:输入:n = 1输出:true提示:-231 <= n <= 231 - 1代码1:public boolean isPowerOfFour(int n) { if(n<=0) {原创 2021-05-31 11:12:49 · 103 阅读 · 0 评论 -
【Java】231. 2 的幂---时间复杂度O(1),快速解决!!!
给你一个整数 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提示:-231 <= n <= 2原创 2021-05-30 09:08:11 · 96 阅读 · 0 评论 -
【java】数组中相加和为0的三元组---时间复杂度O(N^2),优化代码!!!
描述给出一个有n个元素的数组S,S中是否有元素a,b,c满足a+b+c=0?找出数组S中所有满足条件的三元组。注意:三元组(a、b、c)中的元素必须按非降序排列。(即a≤b≤c)解集中不能包含重复的三元组。例如,给定的数组 S = {-10 0 10 20 -10 -40},解集为(-10, -10, 20),(-10, 0, 10)0 <= S.length <= 1000示例1输入:[0]返回值:[]示例2输入:[-2,0,1,1,2]返回值:[[-2,0,2原创 2021-05-29 10:02:20 · 375 阅读 · 0 评论 -
【java】477. 汉明距离总和---时间复杂度O(N),遍历最优解!!!
两个整数的 汉明距离 指的是这两个数字的二进制数对应位不同的数量。计算一个数组中,任意两个数之间汉明距离的总和。示例:输入: 4, 14, 2输出: 6解释: 在二进制表示中,4表示为0100,14表示为1110,2表示为0010。(这样表示是为了体现后四位之间关系)所以答案为:HammingDistance(4, 14) + HammingDistance(4, 2) + HammingDistance(14, 2) = 2 + 2 + 2 = 6.注意:数组中元素的范围为从 0到 10原创 2021-05-28 15:35:10 · 607 阅读 · 0 评论 -
【Java】461. 汉明距离---使用异或位运算符!!!
两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目。给出两个整数 x 和 y,计算它们之间的汉明距离。注意:0 ≤ x, y < 231.示例:输入: x = 1, y = 4输出: 2解释:1 (0 0 0 1)4 (0 1 0 0)上面的箭头指出了对应二进制位不同的位置。代码:public int hammingDistance(int x, int y) { int a=x^y; int sum=0; while(a!=0) {原创 2021-05-27 14:31:22 · 105 阅读 · 0 评论 -
【java】1707. 与数组中元素的最大异或值---使用分叶,贪心算法!!!
给你一个由非负整数组成的数组 nums 。另有一个查询数组 queries ,其中 queries[i] = [xi, mi] 。第 i 个查询的答案是 xi 和任何 nums 数组中不超过 mi 的元素按位异或(XOR)得到的最大值。换句话说,答案是 max(nums[j] XOR xi) ,其中所有 j 均满足 nums[j] <= mi 。如果 nums 中的所有元素都大于 mi,最终答案就是 -1 。返回一个整数数组 answer 作为查询的答案,其中 answer.length == q原创 2021-05-23 09:16:46 · 107 阅读 · 0 评论 -
【java】810. 黑板异或游戏---时间复杂度O(N),快速解决问题!!!
黑板上写着一个非负整数数组 nums[i] 。Alice 和 Bob 轮流从黑板上擦掉一个数字,Alice 先手。如果擦除一个数字后,剩余的所有数字按位异或运算得出的结果等于 0 的话,当前玩家游戏失败。 (另外,如果只剩一个数字,按位异或运算得到它本身;如果无数字剩余,按位异或运算结果为 0。)换种说法就是,轮到某个玩家时,如果当前黑板上所有数字按位异或运算结果等于 0,这个玩家获胜。假设两个玩家每步都使用最优解,当且仅当 Alice 获胜时返回 true。示例:输入: nums = [1, 1,原创 2021-05-22 19:03:24 · 162 阅读 · 1 评论 -
【java】1738. 找出第 K 大的异或坐标值---计算每个小矩形的异或!!!
给你一个二维矩阵 matrix 和一个整数 k ,矩阵大小为 m x n 由非负整数组成。矩阵中坐标 (a, b) 的 值 可由对所有满足 0 <= i <= a < m 且 0 <= j <= b < n 的元素 matrix[i][j](下标从 0 开始计数)执行异或运算得到。请你找出 matrix 的所有坐标中第 k 大的值(k 的值从 1 开始计数)。示例 1:输入:matrix = [[5,2],[1,6]], k = 1输出:7解释:坐标 (0,1原创 2021-05-19 09:25:33 · 85 阅读 · 0 评论 -
【java】1442. 形成两个异或相等数组的三元组数目---时间复杂度o(N^2),几行代码快速解决!!!
给你一个整数数组 arr 。现需要从数组中取三个下标 i、j 和 k ,其中 (0 <= i < j <= k < arr.length) 。a 和 b 定义如下:a = arr[i] ^ arr[i + 1] ^ … ^ arr[j - 1]b = arr[j] ^ arr[j + 1] ^ … ^ arr[k]注意:^ 表示 按位异或 操作。请返回能够令 a == b 成立的三元组 (i, j , k) 的数目。示例 1:输入:arr = [2,3,1,6,7]原创 2021-05-18 09:14:08 · 70 阅读 · 0 评论 -
【java】5760. 构成交替字符串需要的最小交换次数---时间复杂度O(N),最牛思路!!!
zui给你一个二进制字符串 s ,现需要将其转化为一个 交替字符串 。请你计算并返回转化所需的 最小 字符交换次数,如果无法完成转化,返回 -1 。交替字符串 是指:相邻字符之间不存在相等情况的字符串。例如,字符串 “010” 和 “1010” 属于交替字符串,但 “0100” 不是。任意两个字符都可以进行交换,不必相邻 。示例 1:输入:s = “111000”输出:1解释:交换位置 1 和 4:“111000” -> “101010” ,字符串变为交替字符串。示例 2:输入:s原创 2021-05-16 14:54:50 · 422 阅读 · 0 评论 -
【java】421. 数组中两个数的最大异或值---暴力枚举,快速解决问题!!!
给你一个整数数组 nums ,返回 nums[i] XOR nums[j] 的最大运算结果,其中 0 ≤ i ≤ j < n 。进阶:你可以在 O(n) 的时间解决这个问题吗?示例 1:输入:nums = [3,10,5,25,2,8]输出:28解释:最大运算结果是 5 XOR 25 = 28.示例 2:输入:nums = [0]输出:0示例 3:输入:nums = [2,4]输出:6示例 4:输入:nums = [8,10,2]输出:10示例 5:输入:nums =原创 2021-05-16 09:04:02 · 98 阅读 · 0 评论 -
【java】1310. 子数组异或查询---使用位运算符,快速解决问题!!!
有一个正整数数组 arr,现给你一个对应的查询数组 queries,其中 queries[i] = [Li, Ri]。对于每个查询 i,请你计算从 Li 到 Ri 的 XOR 值(即 arr[Li] xor arr[Li+1] xor … xor arr[Ri])作为本次查询的结果。并返回一个包含给定查询 queries 所有结果的数组。示例 1:输入:arr = [1,3,4,8], queries = [[0,1],[1,2],[0,3],[3,3]]输出:[2,7,14,8]解释:数组中原创 2021-05-12 08:49:18 · 76 阅读 · 0 评论 -
【java】1734. 解码异或后的排列---注意条件的合理运用,避免踩坑!!!
给你一个整数数组 perm ,它是前 n 个正整数的排列,且 n 是个 奇数 。它被加密成另一个长度为 n - 1 的整数数组 encoded ,满足 encoded[i] = perm[i] XOR perm[i + 1] 。比方说,如果 perm = [1,3,2] ,那么 encoded = [2,1] 。给你 encoded 数组,请你返回原始数组 perm 。题目保证答案存在且唯一。示例 1:输入:encoded = [3,1]输出:[1,2,3]解释:如果 perm = [1,2,3原创 2021-05-11 09:44:15 · 72 阅读 · 0 评论 -
【java】1486. 数组异或操作---使用Java异或运算,简单思路!!!
数组 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, start = 3输出:8解释:数组 nums 为 [3, 5, 7,原创 2021-05-07 08:46:48 · 720 阅读 · 0 评论 -
【java】1720. 解码异或后的数组---使用Java位运算符,避免踩坑!!!
经编码后变为长度为 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,3], first = 1输出:[1,0,2,1]解释:若 arr原创 2021-05-06 08:44:20 · 61 阅读 · 0 评论 -
【java】190. 颠倒二进制位---运算符&与|不能随意的乱用!!!
颠倒给定的 32 位无符号整数的二进制位。提示:请注意,在某些语言(如 Java)中,没有无符号整数类型。在这种情况下,输入和输出都将被指定为有符号整数类型,并且不应影响您的实现,因为无论整数是有符号的还是无符号的,其内部的二进制表示形式都是相同的。在 Java 中,编译器使用二进制补码记法来表示有符号整数。因此,在上面的 示例 2 中,输入表示有符号整数 -3,输出表示有符号整数 -1073741825。进阶:如果多次调用这个函数,你将如何优化你的算法?示例 1:输入: 0000001010原创 2021-03-29 17:14:46 · 107 阅读 · 0 评论 -
【java】191. 位1的个数---复习java位运算符,避免踩坑的一天!!!
编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为汉明重量)。提示:请注意,在某些语言(如 Java)中,没有无符号整数类型。在这种情况下,输入和输出都将被指定为有符号整数类型,并且不应影响您的实现,因为无论整数是有符号的还是无符号的,其内部的二进制表示形式都是相同的。在 Java 中,编译器使用二进制补码记法来表示有符号整数。因此,在上面的 示例 3 中,输入表示有符号整数 -3。示例 1:输入:0000000000000000000原创 2021-03-22 10:28:43 · 178 阅读 · 0 评论