leetcode-数组中只出现一次的数字
一、版本1—有序数组中只出现一次的数字
1、题目描述
给定一个只包含整数的有序数组,每个元素都会出现两次,唯有一个数只会出现一次,找出这个数。
示例 1:
输入: [1,1,2,3,3,4,4,8,8]
输出: 2
示例 2:
输入: [3,3,7,7,10,11,11]
输出: 10
注意: 您的方案应该在 O(log n)时间复杂度和 O(1)空间复杂度中运行。
2、思路
a)使用线性时间异或运算:
 
  
b)实现规定时间复杂度的方法

3、代码
a)使用异或运算实现的代码
 package cn.zifuchuan;
 public class Test7 {
     public static void main(String[] args) {
         int[] nums = {1,1,2,3,3,4,4,8,8};
         System.out.println(singleNonDuplicate(nums));
     }
     public static int singleNonDuplicate(int[] nums) {
         int temp = 0;
         for (int i = 0; i < nums.length; i++) {
             temp ^= nums[i];
         }
         return temp;
     }
 }
b)二分法查找实现
 package cn.zifuchuan;
 public class Test7 {
     public static void main(String[] args) {
         int[] nums = {1, 1, 2, 2, 4, 4, 5, 5,9};
         System.out.println(singleNonDuplicate(nums));
     }
 //    public static int singleNonDuplicate(int[] nums) {
 //        int temp = 0;
 //        for (int i = 0; i < nums.length; i++) {
 //            temp ^= nums[i];
 //        }
 //        return temp;
 //    }
     public static int singleNonDuplicate(int[] nums) {
         int low = 0, high = nums.length - 1;
         int mid = (high - low) / 2;
         while(low < mid) {
             if((nums[mid] == nums[mid - 1])) { //和左边相等,那么出现一次的就在右边
                 if((mid - low) % 2 != 0) {
                     low = mid + 1;
                     System.out.println("low=" + low + "nums[low]" + nums[low]);
                 } else {
                     high = mid - 2;
                     System.out.println("high=" + high + "nums[high]" + nums[high]);
                 }
             } else if(nums[mid] == nums[mid + 1]){ //和右边相等,出现一次的就在左边
                 if((mid - low) % 2 != 0) {
                     high = mid - 1;
                     System.out.println("high=" + high + "nums[high]" + nums[high]);
                 } else {
                     low = mid + 2;
                     System.out.println("low=" + low + "nums[low]" + nums[low]);
                 }
             }
             mid = (high - low) / 2 + low; //二分中间位置
             System.out.println("mid=" + mid + "mid:" + nums[mid]);
         }
 //        System.out.println(mid);
         return nums[low];
     }
 }
二、版本二—无须数组中找出两个只出现一次的数字
1、题目描述
  给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。
示例 :
输入: [,,,,,]
输出: [,]
注意:
、结果输出的顺序并不重要,对于上面的例子, [, ] 也是正确答案。
、你的算法应该具有线性时间复杂度。你能否仅使用常数空间复杂度来实现?
2、代码实现
a)位运算实现
     public int singleNumber(int[] nums) {
         int a = 0, b = 0;
         for (int i = 0; i < nums.length; i++) {
             a = (a ^ nums[i]) & ~b;
             b = (b ^ nums[i]) & ~a;
         }
         return a;
     }
b)排序之后实现
     public static int singleNumber(int[] nums) {
         int len = nums.length;
         Arrays.sort(nums);
         for (int i = 0; i < len; i++) {
             if(((i + 1) < (len - 1)) && (nums[i] == nums[i + 1]) ) {
                 i = i + 2;
                 continue;
             } else if(((i+1) < (len - 1)) && (nums[i] != nums[i + 1])){
                 return nums[i];
             } else {
                 return nums[len-1];
             }
         }
         return 0;
     }
leetcode-数组中只出现一次的数字的更多相关文章
- leetcode 136. Single Number 、 137. Single Number II 、 260. Single Number III(剑指offer40 数组中只出现一次的数字)
		136. Single Number 除了一个数字,其他数字都出现了两遍. 用亦或解决,亦或的特点:1.相同的数结果为0,不同的数结果为1 2.与自己亦或为0,与0亦或为原来的数 class Solu ... 
- 九度OJ 1351 数组中只出现一次的数字
		题目地址:http://ac.jobdu.com/problem.php?pid=1351 题目描述: 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 输 ... 
- 剑指Offer 40. 数组中只出现一次的数字 (数组)
		题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了偶数次.请写程序找出这两个只出现一次的数字. 题目地址 https://www.nowcoder.com/practice/e02fdb54 ... 
- 剑指Offer - 九度1351 - 数组中只出现一次的数字
		剑指Offer - 九度1351 - 数组中只出现一次的数字2013-11-23 01:23 题目描述: 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. ... 
- 【剑指Offer】40、数组中只出现一次的数字
		题目描述: 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字.要求时间复杂度为O(n),空间复杂度为O(1). 解题思路: 这道题目相对比较难 ... 
- 剑指offer:数组中只出现一次的数字
		题目描述: 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 思路分析: 1. 直接想法,每个数字遍历,统计出现次数,复杂度O(n^2),超时. 2. 借助 ... 
- 《剑指offer》数组中只出现一次的数字
		本题来自<剑指offer> 数组中只出现一次的数字 题目: 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 思路: 思路一:在<剑指of ... 
- 【剑指Offer】数组中只出现一次的数字 解题报告(Python)
		[剑指Offer]数组中只出现一次的数字 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-intervie ... 
- 剑指offer-第六章面试中的各项能力(数组中只出现一次的数字)
		题目:输入一个数组,该数组中有两个只出现一次的数字,其他的数字都出现两次,输出出只出现一次的数字. 思路:首先,我们可以将这个数组分成两份,一份里面放一个只出现一次的数字.那么我们该怎么分呢?将整个数 ... 
- 九度OJ 1351:数组中只出现一次的数字 (位运算)
		时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:3098 解决:906 题目描述: 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 输入: 每个 ... 
随机推荐
- 详解MariaDB数据库的触发器
			1.什么是触发器 触发器是一种特殊的存储过程,它在插入,删除或修改特定表中的数据时触发执行 它比数据库本身标准的功能有更精细和更复杂的数据控制能力 2.触发器的作用: 2.1 安全性 可以基于数据库的 ... 
- 个人NABCD
			采用NABCD模型对我们的团队项目大学生失物招领平台进行了详细的需求分析说明,其中N指(Need需求),A (Approach 做法),B (Benefit好处),C (Competitors 竞争) ... 
- python学习-Pillow图像处理
			Pillow中文文档:https://pillow-cn.readthedocs.io/zh_CN/latest/handbook/tutorial.html 安装:pip install pillo ... 
- Appium 测试微信小程序 Webview
			通过微信打开debugx5.qq.com,或者直接扫下面二维码 勾选[打开TBS内核Inspector调试功能] Chrome查看页面元素 手机连接电脑,查看是否连接成功.如下展示设备号则为连 ... 
- pwn学习(2)
			0x00 序  之前学了蒸米大佬的ropx86,本次学习 ropx64 0x01 Leak Memory & Dynelf  蒸米大佬使用pwntools的Dynelf模块来获取函数地址, ... 
- SEH exception with code 0xc0000005 thrown in the test body
			在用Visual Studio时遇到这个报错.原因:访问了非法的内存地址. 这个问题不应该被忽略,通常是代码有bug. 解决办法: VS2013: 菜单->Debug->Exception ... 
- Redis数据类型SortedSET
			Sorted Set有点像Set和Hash的结合体.和Set一样,它里面的元素是唯一的,类型是String,所以它可以理解为就是一个Set.但是Set里面的元素是无序的,而Sorted Set里面的元 ... 
- Angular Material 白天模式和黑夜模式
			Material design调色板 https://www.materialpalette.com/ 明暗:虽然颜色不变,但是针对白天黑夜有做不同处理. 叠加:对话框,弹出菜单,事先是没有加载的.是 ... 
- James Munkres Topology: Sec 22 Exer 3
			Exercise 22.3 Let \(\pi_1: \mathbb{R} \times \mathbb{R} \rightarrow \mathbb{R}\) be projection on th ... 
- sqlserver2008 批量插入数据
			private DataTable GetTableSchema() { DataTable dt = new DataTable(); dt.Columns.AddRange(new DataCol ... 
