我是靠谱客的博主 纯真便当,最近开发中收集的这篇文章主要介绍LeetCode刷题:位运算(找不同 和 只出现一次的数字),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

1.常见的位运算

按位与&:(1&1=1,1&0=0,0&1=0,0&0=0);
按位或 | : (1 | 1=1,1 | 0=1,0 | 1=1,0 | 0=0);
按位非 ~: ( ~1=0, ~0=1);
按位异或 ^ : (1^1=0 ,1^0=1, 0^1=1, 0^0=0);
异或运算有以下三个性质。
任何数和 0做异或运算,结果仍然是原来的数,即 a ⊕ 0 = a a oplus 0=a a0=a
任何数和其自身做异或运算,结果是 0,即 a ⊕ a = 0 a oplus a=0 aa=0
异或运算满足交换律和结合律,即 a ⊕ b ⊕ a = b ⊕ a ⊕ a = b a oplus b oplus a=b oplus a oplus a=b aba=baa=b ⊕ ( a ⊕ a ) = b ⊕ 0 = b oplus (a oplus a)=b oplus0=b (aa)=b0=b
简单来说,如果参与异或的两个数相同,则它们异或的结果便为0,而0与任何数的异或就是该数本身,利用该性质,我们可以极大地简化我们的程序。
接下来请具体看下面两个LeetCode题目。

2.找不同

给定两个字符串 s 和 t ,它们只包含小写字母。
字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。
请找出在 t 中被添加的字母。
示例一:
在这里插入图片描述
示例二:
在这里插入图片描述

1.思路分析

我们利用异或运算,将两个字符串s和t的所有字符进行异或运算,最终得到的就是那最后一个不同的字符的ASCll编码,注意,最后返回的时候需要强转为char类型。具体代码如下所示:

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

2.结果展示

在这里插入图片描述

3.只出现一次的数字

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

1.思路分析

同样的,该题与上一题找不同类似,同样是找到在数组中无法配对的数字,即如果将数组中的所有元素进行异或运算,最后的结果就是那个只出现一次的数字。具体代码如下所示:

class Solution {
    public int singleNumber(int[] nums) {
        int result=0;
        for(int num:nums){
            result=result^num;
        }
        return result;
    }
}

2.结果展示

在这里插入图片描述
以上两个题目是进行异或运算的典型例题,可以极大地简化我们的程序。所以,我们在日常的编程中要熟练掌握并运用位运算。

最后

以上就是纯真便当为你收集整理的LeetCode刷题:位运算(找不同 和 只出现一次的数字)的全部内容,希望文章能够帮你解决LeetCode刷题:位运算(找不同 和 只出现一次的数字)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(51)

评论列表共有 0 条评论

立即
投稿
返回
顶部