
收获 :a^a=0; a^0=a; a^b^a=b; a^(b^c)=(a^b)^c; x & ~x = 0; x & ~0 = x;
一 、191. 位1的个数
编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 '1' 的个数(也被称为汉明重量)。
int hammingWeight(uint32_t n) {
int x=0;
while(n){
if(n&1==1) x++;
n>>=1;
}
return x;
}
思路 :简单的遍历 每次记录 1的个数.
二 、461. 汉明距离
两个整数之间的 汉明距离 指的是这两个数字对应二进制位不同的位置的数目。
给你两个整数 x 和 y,计算并返回它们之间的汉明距离。
int hammingDistance(int x, int y){
int count=0;
int n=x^y;
while(n){
if(n&1) count++;
n>>=1;
}
return count;
}
思路 :首先 明白汉明距离 说什么意思 将这两个数 异或 再循环找但1的个数 .
三 、136. 只出现一次的数字
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
int singleNumber(int* nums, int numsSize){
int s=0;
for(int i=0;i
思路 :首先直接循环进行异或,那么剩下的就是多的数 就是.
四、只出现一次的数字 II
给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。
/*int singleNumber(int* nums, int numsSize){
int a=0,b=0;
for(int i=0;i>i)&1;
}
if(cnt%3){
ret+=((unsigned int )1<
思路 :第一种方法在注释里 首先得熟悉按位 *** 作 当 b=(b^nums[i])&~a;又开头可知 b=x;
a=(a^nums[i])&~b a=0;当再次遇见相同的数时 那么b=0,a=x;第三次遇见 b=0;a=0;
所以可以将三位数解决 .
第二种方法 想象成32位二进制 每次进行第一位到31位为1的cnt++;因为每个数相同 %3那么一定为0 只有多余的那个数 才除不尽 那么 将其加到ret中。再返回其值.
五、868. 二进制间距
给定一个正整数 n,找到并返回 n 的二进制表示中两个 相邻 1 之间的 最长距离 。如果不存在两个相邻的 1,返回 0 。
如果只有 0 将两个 1 分隔开(可能不存在 0 ),则认为这两个 1 彼此 相邻 。两个 1 之间的距离是它们的二进制表示中位置的绝对差。例如,"1001" 中的两个 1 的距离为 3 。
int binaryGap(int n){
int max=0,now=0,pre=-1;
while(n){
if(n&1==1){
if(pre!=-1){
if(max>=1;
now++;
}
return max;
}
思路 :首先设两个下标 进行循环 如果n&1成立 说明遇见1 则可以进行判断最大距离(并将这次遇见的1做距离标记) 如果没遇见 那么now++.
六 、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 。可以证明答案存在并且是唯一的
int* decode(int* encoded, int encodedSize, int first, int* returnSize) {
int* p =(int *) malloc(sizeof(int) * (encodedSize + 1));
p[0] = first;
*returnSize = encodedSize + 1;
for (int i = 0; i < encodedSize; i++) {
p[i + 1] = encoded[i] ^ p[i];
}
return p;
}
思路 :首先已经知道第一个原先值 那么根据 a^b=c c^b=a 所以可以进行遍历将其计算出来.
七 、1734. 解码异或后的排列
给你一个整数数组 perm ,它是前 n 个正整数的排列,且 n 是个 奇数 。
它被加密成另一个长度为 n - 1 的整数数组 encoded ,满足 encoded[i] = perm[i] XOR perm[i + 1] 。比方说,如果 perm = [1,3,2] ,那么 encoded = [2,1] 。
给你 encoded 数组,请你返回原始数组 perm 。题目保证答案存在且唯一。
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* decode(int* encoded, int encodedSize, int* returnSize){
int *p=(int *)malloc(sizeof(int )*(encodedSize+1));
*returnSize=encodedSize+1;
int n=encodedSize+1;
int x=0,y=0;
for(int i=1;i<=n;i++){
x^=i;
}
for(int i=1;i
思路 :首先没有给你第一个原先值 所以第一步就要找第一个原先值 根据官方的定义 p[0]=(1^2^3...^n)^(encoded[i]^…encode[n-2]) n为奇数 那么容易找出.
来自英雄哪里出来
题源 :leetcode
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)