关于位运算的算法题:只出现一次的数字,求众数,Nim游戏,汉明距离,2的幂,比特位计数

本文介绍了使用位运算解决一系列算法问题,包括找出数组中只出现一次的数字、求众数、玩Nim游戏、计算汉明距离、判断2的幂以及计算比特位计数。通过Java和JavaScript的示例代码,展示了如何巧妙运用位运算达到高效解题的目的。
摘要由CSDN通过智能技术生成
1. 只出现一次的数字

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

示例 1:
输入: [2,2,1]
输出: 1

示例 2:
输入: [4,1,2,1,2]
输出: 4

java答案:

1. 排序
class Solution {
    public int singleNumber(int[] nums) {
        Arrays.sort(nums);
        for(int i=0;i<nums.length-1;i++){
            if(nums[i] == nums[i+1]){
                i=i+1;
            }else{
                return nums[i];
            }
        }
        return nums[nums.length-1];
    }
}
时间复杂度o(nlogn)

2. HashMap方法
class Solution {
    public int singleNumber(int[] nums) {
        Map<Integer, Integer> map = new HashMap<>();
        for (Integer i : nums) {
            Integer count = map.get(i);
            count = count == null ? 1 : ++count;
            map.put(i, count);
        }
        for (Integer i : map.keySet()) {
            Integer count = map.get(i);
            if (count == 1) {
                return i;
            }
        }
        return -1; //没有找到
    }
}
时间复杂度是o(n),空间复杂度是o(n)

3. 异或方法:参加运算的两个对象,如果两个相应位为“异”(值不同),则该位结果为1,否则为0。
class Solution {
    public int singleNumber(int[] nums) {
        int ans = nums[0];
        if (nums.length > 1) {
           for (int i = 1; i < nums.length; i++) {
              ans = ans ^ nums[i];
           }
         }
         return ans;
         }
       }
       时间复杂度是o(n),空间复杂度是o(1)

注意:
HashMap的方法:
创建对象:Map<Integer, Integer> map = new HashMap<>();
V put(K key, V value) :以键=值的方式存入Map集合
V get(Object key) :根据键获取值
int size():返回Map中键值对的个数
boolean containsKey(Object key) :判断Map集合中是否包含键为key的键值对
boolean containsValue(Object value) :判断Map集合中是否包含值为value键值对
遍历:
Set keys = map.keySet();
for(String key:keys){
String value = map.get(key);
System.out.println(key+"-----"+value);
}

JavaScript答案:

1. 排序
/**
 * @param {number[]} nums
 * @return {number}
 */
var singleNumber = function(nums) {
    nums.sort();
    for(var i=0;i<nums.length-1;i++){
        if(nums[i]==nums[i+1]){
           i=i+1;
        }else{
            return nums[i];
        }
    }
    return nums[nums.length-1];
};
2. 异或
/**
 * @param {number[]} nums
 * @return {number}
 */
var singleNumber = function(nums) {
    var ans = nums[0];
    for(var i=1;i<nums.length;i++){
        ans = ans^nums[i];
    }
    return ans;
};
2. 求众数

给定一个大小为 n 的数组,找到其中的众数。众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在众数。

示例 1:
输入: [3,2,3]
输出: 3

示例 2:
输入: [2,2,1,1,1,2,2]
输出: 2
java答案:

1. 双重for循环:时间复杂度是o(n^2),空间复杂度是o(1)
2. 排序后,中间的一定是众数
class Solution {
    public int majorityElement(int[] nums) {
        Arrays.sort(nums);
        return nums[nums.length/2];
    }
}
时间复杂度是o(nlgn),空间复杂度是o(1)或o(n),将 nums 就地排序,如果不能就地排序,我们必须使用线性空间将 nums 数组拷贝,然后再排序。
3.  hashMap
class Solution {
 
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值