异或运算在编程中的应用

题目描述

1. 只出现一次的数字
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

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

示例 2:
输入: [4,1,2,1,2]
输出: 4
题目来源

2. 缺失数字
给定一个包含 0, 1, 2, …, n 中 n 个数的序列,找出 0 … n 中没有出现在序列中的那个数。

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

示例 2:
输入: [9,6,4,2,3,5,7,0,1]
输出: 8

说明:
你的算法应具有线性时间复杂度。你能否仅使用额外常数空间来实现?
题目来源

3. 找不同
给定两个字符串 s 和 t,它们只包含小写字母。
字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。
请找出在 t 中被添加的字母。

示例:
输入:
s = “abcd”
t = “abcde”

输出:
e

解释:
‘e’ 是那个被添加的字母。
题目来源

代码展示

1. 只出现一次的数字

只出现一次的数字的题型这里使用异或的方法解决,同样地,如果问 出现 奇数次的一个数字(其他数字都出现偶数次) 也可用同样的方法。或者采用哈希表的方式,请读者思考哈希表的求解过程。之后会更新关于哈希表的相关解法。

class Solution {
    public int singleNumber(int[] nums) {
        int result=0;
        for(int i=0;i<nums.length;i++){
            result=nums[i]^result;
        }
        return result;
        }
    }

2. 缺失数字

这里列举了三种常见的方法,而且这三种方法相对其他方法较为高效。方法一和方法三原理相同,只是计算过程不同。而方法二是采用异或的方法,这样可以提高程序运行的效率。并且其他两个题目也可以仿照这三种方法进行求解。

class Solution {
    public int missingNumber(int[] nums) {
        int result=0;
        for(int i=0;i<nums.length;i++){
            result=result-nums[i]+i;
        }
        result=result+nums.length;
        return result;
        }
    }
class Solution {
    public int missingNumber(int[] nums) {
            int result=0;
        for(int i=0;i<nums.length;i++){
            result=result^nums[i]^i;
        }
        result=result^nums.length;
        return result;
    }
}
class Solution {
    public int missingNumber(int[] nums) {
                int sum = 0;
        for(int i = 0; i < nums.length; i++){
            sum += nums[i];
        }
        return nums.length * (nums.length + 1) / 2 - sum;
    }
}

3. 找不同

class Solution {
    public char findTheDifference(String s, String t) {
        int result=0;
        for(int i=0;i<s.length();i++){
            result=result^s.charAt(i)^t.charAt(i);
        }
        result=result^t.charAt(t.length()-1);
        return (char)result;
    }
}

由于异或运算属于二进制的底层机器运算,所以其效率比一般的计算过程要高,这类题目有人采用排序等直接的方法,这样提高了时间复杂度;或者重新创建一个新的数组,这样提高了空间复杂度。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值