一、版本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. Kali Linux ——在无网络情况下安装无线网卡驱动

    1.背景: 今日刚刚开始学习kali linux,众所周知,安装完成后,系统是没有无线网卡驱动的,这就对学生党造成相当的困扰:校园网要连接有线是需要认证客户端的,而认证客户端只有windows端,如此 ...

  2. Jace 上新建 Station 配置 笔记

    1.Station站点的结构图 2.niagara 结构框架图 Niagara 系统的架构是围绕着“以组件(Component)为导向的编程”为核心设计的.组件(Component)是使用Java 编 ...

  3. Windows安装redis并将redis设置成服务

    Redis 作为一种缓存工具,主要用于解决高并发的问题,在分布式系统中有着极其广泛的应用,Redis 本身是应用于 Linux/Unix 平台的(部署在服务器上边),官方并没有提供 Windows 平 ...

  4. jq修改hover样式

    $("#resTree").hover(function(){ $(this).css("background-color","yellow" ...

  5. ssh-copy-id使用非默认22端口时

    http://blog.sina.com.cn/s/blog_541a3cf10101epzf.html

  6. aliyun install Discourse log

    apt update apt install wget wget -qO- https://get.docker.com/ | sh vim /etc/default/docker DOCKER_OP ...

  7. 记一次线上Zabbix对Redis监控实录

    前言:Redis作为缓存服务器我想大家都比较的熟悉,那么,如果想要更好的维护和监控,那么我们会对其redis服务器统一监控起来,如何监控呢?如果在生产环境一台服务器部署多个redis,这样就会出现多个 ...

  8. 微服务框架——SpringCloud(三)

    1.Zuul服务网关 作用:路由转发和过滤,将请求转发到微服务或拦截请求.Zuul默认集成了负载均衡功能. 2.Zuul实现路由 a.新建springboot项目,依赖选择 Eureka Discov ...

  9. C#代码总结01---如何清空页面上所有文本框的内容。(用于录入后的清空)

    /// <summary> /// 清空页面上所有TextBox的内容.用于录入后的清空 /// </summary> /// <param name="top ...

  10. 20162329张旭升 2018-2019-2《网络对抗技术》第1周 Kali的安装

    目录 Kali的安装 设置与主机的文件交互 Kali的安装 1.创建虚拟机 2.选择安装语言 3.设置网络 4.设置分区 5.安装完成 设置与主机的文件交互 首先在vmware workstation ...