提示:本次博文进行解答的问题列表
6.汉明距离
7.消失的数字
8.二进制中1的个数
9.0~n-1中缺失的数字
10.前n个数字二进制中1的个数
11.只出现一次的数字I
12.只出现一次的数字II
13.只出现一次的数字III
14.只出现一次的数字IV
前言
提示:此次博文是位运算的合集之一,新的小伙伴想要看其他关于位运算的内容可以看看之前的博客!
提示:以下是本篇文章正文内容,下面案例可供参考
六、汉明距离
0、代码运行结果:
1.题目描述:
两个整数之间的 汉明距离 指的是这两个数字对应二进制位不同的位置的数目。
给你两个整数 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 <= 2^31 - 1
2.代码如下:
public int hammingDistance(int x, int y) {
if ((x ^ y) == 0) return 0;
return (x ^ y) % 2 + hammingDistance(x / 2, y / 2);
}
3.代码解析:
public int hammingDistance(int x, int y) {
if ((x ^ y) == 0) return 0;
return (x ^ y) % 2 + hammingDistance(x / 2, y / 2);
↑ ↑
}
七.消失的数字
0、代码运行结果:
1.题目描述:
数组nums包含从0到n的所有整数,但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在O(n)时间内完成吗?
示例 1:
输入:[3,0,1]
输出:2
示例 2:
输入:[9,6,4,2,3,5,7,0,1]
输出:8
2.代码如下:
public int missingNumber(int[] nums) {
int res = 0;
int ans =0;
for(int x : nums)
{
res+=x;
}
for(int i = 1;i<=nums.length;i++)
{
ans+=i;
}
return ans - res;
}
3.代码解析:
public int missingNumber(int[] nums) {
int res = 0;
int ans =0;
for(int x : nums)
{
res+=x;
}
for(int i = 1;i<=nums.length;i++)
{
ans+=i;
}
return ans - res;
}
八. 二进制中1的个数
0、代码运行结果:
1.题目描述:
编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 '1' 的个数(也被称为 汉明重量).)。
提示:
请注意,在某些语言(如 Java)中,没有无符号整数类型。在这种情况下,输入和输出都将被指定为有符号整数类型,并且不应影响您的实现,因为无论整数是有符号的还是无符号的,其内部的二进制表示形式都是相同的。
在 Java 中,编译器使用 二进制补码 记法来表示有符号整数。因此,在上面的 示例 3 中,输入表示有符号整数 -3。
示例 1:
输入:n = 11 (控制台输入 00000000000000000000000000001011)
输出:3
解释:输入的二进制串 00000000000000000000000000001011 中,共有三位为 '1'。
示例 2:
输入:n = 128 (控制台输入 00000000000000000000000010000000)
输出:1
解释:输入的二进制串 00000000000000000000000010000000 中,共有一位为 '1'。
示例 3:
输入:n = 4294967293 (控制台输入 11111111111111111111111111111101,部分语言中 n = -3)
输出:31
解释:输入的二进制串 11111111111111111111111111111101 中,共有 31 位为 '1'。
提示:
输入必须是长度为 32 的 二进制串 。
2.代码如下:
public int hammingWeight(int n) {
int res = 0;
while(n != 0)
{
int rightOne = n & (~n + 1);
n ^= rightOne;
res ++;
}
return res;
}
3.代码解析:
public int hammingWeight(int n) {
int res = 0;
while(n != 0)
{
int rightOne = n & (~n + 1);
n ^= rightOne;
res ++;
}
return res;
}
九.0~n-1中缺失的数字
0、代码运行结果:
1.题目描述:
一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。
示例 1:
输入: [0,1,3]
输出: 2
示例 2:
输入: [0,1,2,3,4,5,6,7,9]
输出: 8
限制:
1 <= 数组长度 <= 10000
2.代码如下:
public int missingNumber(int[] nums) {
int res = 0;
for(int i = 0; i < nums.length;i++)
{
res = i ^ nums[i];
if(res != 0)
{
return i;
}
}
return nums.length;
}
3.代码解析:
public int missingNumber(int[] nums) {
int res = 0;
for(int i = 0; i < nums.length;i++)
{
res = i ^ nums[i];
if(res != 0)
{
return i;
}
}
return nums.length;
}
十.前n个数字二进制中1的个数
0、代码运行结果:
1.题目描述:
给定一个非负整数 n ,请计算 0 到 n 之间的每个数字的二进制表示中 1 的个数,并输出一个数组。
示例 1:
输入: n = 2
输出: [0,1,1]
解释:
0 --> 0
1 --> 1
2 --> 10
示例 2:
输入: n = 5
输出: [0,1,1,2,1,2]
解释:
0 --> 0
1 --> 1
2 --> 10
3 --> 11
4 --> 100
5 --> 101
说明 :
0 <= n <= 10^5
2.代码如下:
public int[] countBits(int n) {
int[] bits = new int[n + 1];
for (int i = 1; i <= n; i++) {
bits[i] = bits[i & (i - 1)] + 1;
}
return bits;
}
3.代码解析:
public int[] countBits(int n) {
int[] bits = new int[n + 1];
for (int i = 1; i <= n; i++) {
bits[i] = bits[i & (i - 1)] + 1;
}
return bits;
}
十一.只出现一次的数字I
0、代码运行结果:
1.题目描述:
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,1]
输出: 1
示例 2:
输入: [4,1,2,1,2]
输出: 4
2.代码如下:
public int singleNumber(int[] nums) {
int x = 0;
for(int i = 0 ; i < nums.length;i++)
{
x ^= nums[i];
}
return x;
}
3.代码解析:
public int singleNumber(int[] nums) {
int x = 0;
for(int i = 0 ; i < nums.length;i++)
{
x ^= nums[i];
}
return x;
}
十二.只出现一次的数字II
0、代码运行结果:
1.题目描述:
给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。
示例 1:
输入:nums = [2,2,3,2]
输出:3
示例 2:
输入:nums = [0,1,0,1,0,1,99]
输出:99
2.代码如下:
public int singleNumber(int[] nums) {
int a = 0, b = 0;
for (int num : nums) {
b = ~a & (b ^ num);
a = ~b & (a ^ num);
}
return b;
}
3.代码解析:
图片1: 图片2: 图片3: 图片4:
public int singleNumber(int[] nums) {
int a = 0, b = 0;
for (int num : nums) {
b = ~a & (b ^ num);
a = ~b & (a ^ num);
}
return b;
}
十三.只出现一次的数字III
0、代码运行结果:
1.题目描述:
给定一个整数数组 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.代码如下:
public int[] singleNumber(int[] arr) {
int eor = 0;
for (int i = 0; i < arr.length; i++) {
eor ^= arr[i];
}
int rightOne = eor & (~eor + 1);
int onlyOne = 0;
for (int i = 0 ; i < arr.length;i++) {
if ((arr[i] & rightOne) != 0) {
onlyOne ^= arr[i];
}
}
return new int[]{onlyOne, eor ^ onlyOne};
}
3.代码解析:
public int[] singleNumber(int[] arr) {
int eor = 0;
for (int i = 0; i < arr.length; i++) {
eor ^= arr[i];
}
int rightOne = eor & (~eor + 1);
int onlyOne = 0;
for (int i = 0 ; i < arr.length;i++) {
if ((arr[i] & rightOne) != 0) {
onlyOne ^= arr[i];
}
}
return new int[]{onlyOne, eor ^ onlyOne};
}
十四.只出现一次的数字IV
0、代码运行结果:
1.题目描述:
给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。
示例 1:
输入:nums = [2,2,3,2]
输出:3
示例 2:
输入:nums = [0,1,0,1,0,1,100]
输出:100
2.代码如下:
public int singleNumber(int[] nums) {
int a = 0, b = 0;
for (int num : nums) {
b = ~a & (b ^ num);
a = ~b & (a ^ num);
}
return b;
}
3.代码解析:
图片1: 图片2: 图片3: 图片4:
public int singleNumber(int[] nums) {
int a = 0, b = 0;
for (int num : nums) {
b = ~a & (b ^ num);
a = ~b & (a ^ num);
}
return b;
}
|