一、版本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. uni-app 引入本地iconfont的正确姿势以及阿里图标引入

    1.引入本地iconfont iconfont文件里面包含 iconfont.ttf.iconfont.css, 将 iconfont.tt64文件转位 base64.推荐转换工具地址:https:/ ...

  2. C# 高级编程04----类

    一.类和结构: 相同点: 1. 类和结构都是创建对象的模板,包含数据成员和方法成员 不同点: 1.在内存中的存储方式: 1)类是存储在堆内存上的引用类型,结构是存储在栈内存的值类型 2)结构不支持继承 ...

  3. Nginx 中利用 Lua 脚本做访问控制

    使用场景 需要在后端服务之前做访问控制,或没有后端服务的场景,如静态文件. 实验环境 Ubuntu 14.04 Nginx 1.4.6 安装 Lua 运行环境 sudo apt-get install ...

  4. mac上安装vue项目

    mac上如何安装vue项目 一, mac系统安装brew /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/H ...

  5. vue -- style使用scss样式报错

    1.报错信息 2.解决方案(vue-li默认没有scss-loader,scss-loader)安装以下依赖 (1) npm install node-sass --save (2)npm insta ...

  6. 控制可编辑的Div 在添加图片,或者@某人的时候 光标移动到最后

    this.$refs.editor.innerHTML += '<span style="color:yellowgreen;">@ 野猪佩奇</span> ...

  7. Jmeter函数助手

    1.__Random:产生0-10之间的随机数[__RadomString:随机生成字符函数同__Random]

  8. 第六章 对象-javaScript权威指南第六版(二)

    通过原型 继承创建一个新对象,对于这一个函数的有说不出的感觉,看看语句都很简单,深层次的东西就是不知道 function inherit(p) { if(p == null)  throw TypeE ...

  9. Ubuntu server 16.04安装,无网卡驱动解决

    因为使用一个软件必须要在ubuntu server 16.04上安装,因此先在裸机上安装ubuntu server 16.04,具体信息: 镜像版本:ubuntu-16.04.6-server-amd ...

  10. Springboot 2.x 无法读取yml配置值的问题:Could not resolve placeholder xxx value '${xxx}'

    最近在用Springboot2.1 新建demo工程的时候,在DataSourceConfig类中通过 @Value("${spring.datasource.url}") 的方式 ...