leetcode_136
来源:互联网 发布:域名有什么作用 编辑:程序博客网 时间:2024/06/05 19:10
题目大意:有一个数组,所有数字出现两次,只有一个出现一次,找出这个数。
**题目要求:**O(n)时间复杂度,O(1)空间复杂度。
解题分析:题目很简单,最笨的方法,是用双重循环去找,这里就不解释了;用hashset,或者hashmap去做,只用循环一次,但是空间复杂度会高;用数学中的异或去做,可以满足要求。
1,双重循环:太简单,不解释
2,hash集合:
public static int singleNumber1(int[] nums) { Map<Integer, Integer> map = new HashMap<Integer, Integer>(); for(int i=0;i<nums.length;i++) { if(map.get(nums[i]) == null) { map.put(nums[i], 1); }else { map.remove(nums[i]); } } return map.keySet().iterator().next(); }
HashSet<Integer> a = new HashSet<Integer>(); for(int i = 0;i < nums.length;i++) { if(!a.contains(nums[i])) { a.add(nums[i]); }else { a.remove(nums[i]); } } return a.iterator().next();
3,用异或做:
异或的性质1:交换律a ^ b = b ^ a,性质2:0 ^ a = a。于是利用交换律可以将数组假想成相同元素全部相邻,于是将所有元素依次做异或操作,相同元素异或为0,最终剩下的元素就为Single Number。时间复杂度O(n),空间复杂度O(1)
public static int singleNumber3(int[] nums) { int n = 0; for(int i = 0;i<nums.length;i++) { n = n ^ nums[i]; } return n; }
public int singleNumber(int[] nums) { int n = 0; for(int i:nums) { n = n ^ i; } return n; }
4,python语言:
class Solution(object): def singleNumber(self, nums): """ :type nums: List[int] :rtype: int """ n = 0 for i in nums: n = n ^ i return n
1 0
- leetcode_136
- leetcode_136 Single Number
- leetcode_136. Single Number
- LeetCode_136. Single Number
- LeetCode_136-Single Number
- leetcode_136 Single Number-找数组中唯一的单身数
- Error running app: Instant Run requires 'Tools | Android | Enable ADB integration' to be enabled.
- 设计模式之工厂模式
- Java软件工程师就业思维图
- MVC5创建自定义图片链接
- 二叉搜索树的插入和删除
- leetcode_136
- A Discriminative Feature Learning Approach for Deep Face Recognition, ECCV16.
- Android之内存泄露LeakCanary检测
- 快速排序
- 第82篇 webrtc一对一研究(十)及php
- 最简单的webview监听及传值
- 数据结构示例之用链表实现栈
- Linux命令之"df"
- 将一个链表中结点的值按奇偶拆分,使其中一个链表结点的值为偶数,另一个为奇数