【算法】位运算| & ^ ~ -n n-1

【算法】位运算| & ^ ~ -n n-1

目录

1.| 

2.&

3.^

3.1相加和位

3.1.1无进位去和

3.1.2进位去和

4.~

5.-n

6.n-1

位图


1.| 

1占侧|1 占1|0 化原同 | 同 为同


2.&

0占侧&0 占0&1 化原同 & 同 为同


3.^

无进位加法^0 和原同 ^ 同 消0

3.1相加和位

化二进制bit位01进位/无进位相加和的位上查

3.1.1无进位去和

260. 只出现一次的数字 III - 力扣(LeetCode)

给你一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。你可以按 任意顺序 返回答案。

你必须设计并实现线性时间复杂度的算法且仅使用常量额外空间来解决此问题。

示例 1:

输入:nums = [1,2,1,3,2,5] 输出:[3,5] 解释:[5, 3] 也是有效的答案。

示例 2:

输入:nums = [-1,0] 输出:[-1,0]

示例 3:

输入:nums = [0,1] 输出:[1,0]

提示:

  • 2 <= nums.length <= 3 * 104
  • -231 <= nums[i] <= 231 - 1
  • 除两个只出现一次的整数外,nums 中的其他数字都出现两次
public int[] singleNumber(int[] nums) { int sum = 0; for (int i : nums) sum ^= i; // sum:两个不同数的^和 int tmp1 = sum & -sum; // a和b不同,肯定有一位比特位为1,tmp1:右首1提纯数 // 各只出现1次的 不同的 两个数 和1位 肯定不同,一个是0 一个是1,各分开在 此位为01的 2组中,其余出现2次的 都各成对分布在两组中 和为0,分开来两组消和 两不同数各出 int[] ret = new int[2]; for (int i : nums) { //if((i & tmp1) == 0) if((i & tmp1) != 0) // 右首1这位 为1的 这组,两个不同数的其中一个 这位是1的 分到这组 ret[0] ^= i; else ret[1] ^= i; // 右首1这位 为0的 这组,两个不同数的其中一个 这位是0的 分到这组 } return ret; }

3.1.2进位去和

137. 只出现一次的数字 || - 力扣(LeetCode)

给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。

你必须设计并实现线性时间复杂度的算法且使用常数级空间来解决此问题。

示例 1:

输入:nums = [2,2,3,2] 输出:3

示例 2:

输入:nums = [0,1,0,1,0,1,99] 输出:99

提示:

  • 1 <= nums.length <= 3 * 104
  • -231 <= nums[i] <= 231 - 1
  • nums 中,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次
public int singleNumber(int[] nums) { int ret = 0; for (int i = 0; i < 32; i++) { int sum = 0; for (int x : nums) if (((x >> i & 1) == 1)) sum++; if(sum % 3 == 1) ret |= 1 << i; }return ret; }

4.~

取反


5.-n

右首1 往左取反, n & -n 右首1纯提


6.n-1

右首1 含右取反n & (n-1) 右首1化0


位图

数变量的二进制槽子存bit01 代 对值

面试题 01.01. 判定字符是否唯一 - 力扣(LeetCode)

实现一个算法,确定一个字符串 s 的所有字符是否全都不同。

示例 1:

输入: s = "leetcode" 输出: false

示例 2:

输入: s = "abc" 输出: true

限制:

  • 0 <= len(s) <= 100
  • s[i]仅包含小写字母
  • 如果你不使用额外的数据结构,会很加分。
public boolean isUnique(String astr) { // 鸽巢原理优化: if(astr.length() > 26) return false; int bitMap = 0; // 位图数变量 for (int i = 0; i < astr.length(); i++) { int x = astr.charAt(i) - 'a'; // 判断字符是否已存在位图中: if(((bitMap >> x) & 1) == 1) return false; // 把此字符在位图中标记存在: bitMap |= (1 << x); } return true; }

Read more

Redis Hash 全解析:从入门到精通,解锁高性能对象存储的钥匙

Redis Hash 全解析:从入门到精通,解锁高性能对象存储的钥匙

前言 在现代应用开发中,我们无时无刻不在与“对象”打交道——用户信息、商品详情、配置项、会话数据……如何高效、清晰地在缓存或数据库中存储这些结构化数据,是每一个开发者都需要面对的课题。 你可能会想到将一个对象序列化成 JSON 字符串,然后用一个简单的 Key-Value 方式存入 Redis。这确实是一种方法,但当你只想修改对象的某一个属性(比如用户的积分)时,就不得不读取整个 JSON 字符串,反序列化成对象,修改属性,再序列化回 JSON,最后整个写回 Redis。这个过程不仅繁琐,而且在并发环境下极易引发数据覆盖问题,性能开销也相当可观。 那么,有没有一种更原生、更高效的方式来处理这种“对象”存储呢?答案是肯定的。Redis 为我们提供了一种强大的数据结构,它天生就是为了解决这类问题而生——Hash(哈希/散列)。 本文将带领你深入探索 Redis Hash

By Ne0inhk
数据结构【AVL树】

数据结构【AVL树】

AVL树 * 1.AVL树 * 1.1AVL的概念 * 1.2平衡因子 * 2.AVl树的实现 * 2.1AVL树的结构 * 2.2AVL树的插入 * 2.3 旋转 * 2.3.1 旋转的原则 1.AVL树 1.1AVL的概念 AVL树可以是一个空树。 它的左右子树都是AVL树,且左右子树的高度差的绝对值不超过1。AVL树是一颗高度平衡搜索二叉树,通过控制高度差去控制平衡。 AVL树整体结点数量和分布和完全二叉树类似,高度可以控制在 logN ,那么增删查改的效率也可以控制在O(logN ) ,相比二叉搜索树有了本质的提升。 1.2平衡因子 结点的平衡因子=右子树的高度减去左子树的高度,也就是说任何结点的平衡因子等于0/1/-1,AVL树并不是必须要平衡因子,但是有了平衡因子可以更方便我们去进行观察和控制树是否平衡,就像⼀个风向标一样。 为什么AVL树是高度平衡搜索二叉树,要求高度差不超过1,而不是高度差是0呢? 因为例如二和四个结点无法达到0.

By Ne0inhk
玩转二叉树:数据结构中的经典之作

玩转二叉树:数据结构中的经典之作

、 嘿嘿,家人们,今天咱们来详细剖析数据结构中的二叉树,好啦,废话不多讲,开干! 1:树的概念以及结构 1.1:树的概念 1.2:树的相关概念 1.3:树的表示 1.3.1:左孩子右兄弟表示法 2:二叉树的概念以及结构 2.1:概念 2.2:特殊的二叉树 2.3:二叉树的性质 2.4:二叉树的存储结构 2.4.1:顺序存储 2.4.2:链式存储 3:二叉树的顺序结构以及实现 3.1:二叉树的顺序结构 3.2:

By Ne0inhk