前言
位运算常见的问题。
整数交换
问题描述
不申请新的变量交换a,b。
1 | void swap(int &a, int &b){ |
同时也可以用 +,-
做。
1 | void swap(int &a, int &b){ |
比较
寻找出现奇数次的数字(I)
问题描述
有一个整型数组A,其中只有一个数出现了奇数次,其他的数都出现了偶数次,请打印这个数。要求时间复杂度为O(N),额外空间复杂度为O(1)。
给定整形数组A及它的大小n,请返回题目所求数字。
解题思路
n ^ 0 = n, n ^ n = 0. 依数字次异或到最后就剩那个出现奇数次的数字。
参考代码
1 | int find_num(vector<int> A, n){ |
寻找出现奇数次的数字(II)
问题描述
给定一个整型数组arr,其中有两个数出现了奇数次,其他的数都出现了偶数次,找到这两个数。要求时间复杂度为O(N),额外空间复杂度为O(1)。
给定一个整形数组arr及它的大小n,请返回一个数组,其中两个元素为两个出现了奇数次的元素,请将他们按从小到大排列。
解题思路
首先可以得出现次数为奇数次两个数字的异或值res
,然后求出res
不为0的比特位数。
参考代码
1 | vector<int> find_num(vector<int> arr, int n){ |