我是靠谱客的博主 精明月饼,最近开发中收集的这篇文章主要介绍leetcode之奇妙的异或运算,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

leetcode之奇妙的异或运算

开始之前,我们先了解一下异或的概念:
来源:百度百科
这是百度百科上异或的解释,这里精简一下:
两数异或,相同为0,不同为1.
另外,异或有两个重要的性质:

  • 满足交换律
  • 一个数异或0还是它本身(在后面会用到这两个性质)

1. leetcode 136来源:leetcode#136

这个题比较简单,但如果用异或操作,可以不使用额外空间来实现
原理就是:
先对数组中所有元素进行异或运算。
nums[0] ^ nums[1] ^ … ^ nums[nums.length - 1]
利用上面提到的两个性质:
利用交换律将相同的元素交换在一起执行异或运算,这样可得到:只出现一次的数字^0,再根据第二条性质,所以最后异或得到的结果就为只出现一次的数字。

代码如下:

class Solution {
    public int singleNumber(int[] nums) {//异或运算;
    int single=nums[0];
    for(var i=1;i<nums.length;i++){
        single^=nums[i];
    }
    return single;
    }
}

2. leetcode 389

来源:leetcode#389

这道题的思路也基本相同,只不过是把整型数组变成了字符串而已。

这道题我们可以把两个字符串看成两个字符数组,分别对两个字符串中的char元素进行异或:
s.charAt(0)^s.charAt(1) ^… ^s.charAt(s.length()-1) ^ t.charAt(0) ^ t.charAt(1) ^… ^t.charAt(t.length()-1)

利用上面提到的两个性质:

利用交换律将相同的元素交换在一起执行异或运算,可得到:被添加的字母的ASCII码值^0,再根据第二条性质,所以最后异或得到的结果就为被添加的字母的ASCII码值,最后再利用类型转换转换为char型就得到了最后的结果。

代码如下:

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

看了这两个例子,是不是觉得异或运算是一个很神奇的运算呢?

如果觉得这篇文章对你有帮助,记得给卑微博主点赞、收藏加关注哦!!!

最后

以上就是精明月饼为你收集整理的leetcode之奇妙的异或运算的全部内容,希望文章能够帮你解决leetcode之奇妙的异或运算所遇到的程序开发问题。

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

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

评论列表共有 0 条评论

立即
投稿
返回
顶部