一、版本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-数组中只出现一次的数字的更多相关文章

  1. leetcode 136. Single Number 、 137. Single Number II 、 260. Single Number III(剑指offer40 数组中只出现一次的数字)

    136. Single Number 除了一个数字,其他数字都出现了两遍. 用亦或解决,亦或的特点:1.相同的数结果为0,不同的数结果为1 2.与自己亦或为0,与0亦或为原来的数 class Solu ...

  2. 九度OJ 1351 数组中只出现一次的数字

    题目地址:http://ac.jobdu.com/problem.php?pid=1351 题目描述: 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 输 ...

  3. 剑指Offer 40. 数组中只出现一次的数字 (数组)

    题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了偶数次.请写程序找出这两个只出现一次的数字. 题目地址 https://www.nowcoder.com/practice/e02fdb54 ...

  4. 剑指Offer - 九度1351 - 数组中只出现一次的数字

    剑指Offer - 九度1351 - 数组中只出现一次的数字2013-11-23 01:23 题目描述: 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. ...

  5. 【剑指Offer】40、数组中只出现一次的数字

      题目描述:   一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字.要求时间复杂度为O(n),空间复杂度为O(1).   解题思路:   这道题目相对比较难 ...

  6. 剑指offer:数组中只出现一次的数字

    题目描述: 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 思路分析: 1. 直接想法,每个数字遍历,统计出现次数,复杂度O(n^2),超时. 2. 借助 ...

  7. 《剑指offer》数组中只出现一次的数字

    本题来自<剑指offer> 数组中只出现一次的数字 题目: 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 思路: 思路一:在<剑指of ...

  8. 【剑指Offer】数组中只出现一次的数字 解题报告(Python)

    [剑指Offer]数组中只出现一次的数字 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-intervie ...

  9. 剑指offer-第六章面试中的各项能力(数组中只出现一次的数字)

    题目:输入一个数组,该数组中有两个只出现一次的数字,其他的数字都出现两次,输出出只出现一次的数字. 思路:首先,我们可以将这个数组分成两份,一份里面放一个只出现一次的数字.那么我们该怎么分呢?将整个数 ...

  10. 九度OJ 1351:数组中只出现一次的数字 (位运算)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:3098 解决:906 题目描述: 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 输入: 每个 ...

随机推荐

  1. P3436 [POI2006]PRO-Professor Szu

    P3436 [POI2006]PRO-Professor Szu 题目描述 n个别墅以及一个主建筑楼,从每个别墅都有很多种不同方式走到主建筑楼,其中不同的定义是(每条边可以走多次,如果走边的顺序有一条 ...

  2. docker环境下elasticsearch安装ik和拼音分词

    elasticsearch拼音分词地址:https://github.com/medcl/elasticsearch-analysis-pinyin/releases 在elasticsearch下面 ...

  3. 出错: IOException parsing XML document from ServletContext resource [/cn.mgy.conig]; nested exception is java.io.FileNotFoundException: Could not open ServletContext resource [/cn.mgy.conig]

    错误的详细内容: 严重: StandardWrapper.Throwable org.springframework.beans.factory.BeanDefinitionStoreExceptio ...

  4. 学习笔记_J2EE_Spring(一)_入门

    3.      Spring概述 3.1.   Spring是什么 Spring是一个优秀的高可用的JavaEE轻量级开发框架.提供一站式开发解决方案. 3.2.   Spring框架出现的背景 在世 ...

  5. Django2.0 和 Django1 中的正则匹配问题

    2.0内的path匹配正则时候无效时,导入re_path即可 from django.urls import path,re_path from king_admin import views url ...

  6. ajax导致Echarts不显示饼图数据、柱状图数据只显示气泡的问题。

    1.ajax导致Echarts不显示饼图数据.柱状图数据只显示气泡的问题. ajax的同步.这个同步的意思是当JS代码加载到当前ajax的时候会把页面里所有的代码停止加载,页面出去假死状态,当这个aj ...

  7. 创建、使用SpringBoot项目

    >>>>>>>>>>>>>>>>>>>>>>>>> ...

  8. codeforces / project Euler 泛做

    目录 PE 15 PE 76 PE 90 PE 577 PE 97 PE 364(坑) 待做 发现这个题库,很有意思,趁着还没有学习微积分,看不了书,赶快从头开始刷,所以都是一些简单的题目,即时简单, ...

  9. python_web框架

    一.web框架 web框架: 自己完成socket的web框架:如,Tornado等 由WSGI完成socket的web框架:如,Django.flash等 两种实现过程: 第二种WSGI方式的,由于 ...

  10. bower 基础认识

    bower 跟 npm 很像 都是管理包的工具 只是 bower 偏向前端  npm 前后都能管理 npm init 后是  生产 package.json  下载的包在node_modules文件下 ...