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 题目描述: 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 输入: 每个 ...
随机推荐
- java类(Class)的概念;对象的概念,声明类的属性 和方法,局部变量和成员变量,面向对象编程思维,抽象的概念
类(Class)的概念 类是对一组具有相同特征和行为的对象的抽象描述. 理解: [1] 类包含了两个要素:特性和行为 => 同一类事物具有相同的特征和行为. [2] 类是一个群体性概念.例如:网 ...
- 初识C语言(五)
自定义函数 C语言提供了大量的库函数(右侧资料下载中有),比如stdio.h提供输出函数,但是还是满足不了我们开发中的一些逻辑,所以这个时候需要自己定义函数,自定义函数的一般形式: 注意: 1.[]包 ...
- Kali Linux的vi编辑器/vim编辑器使用方法
转载声明:本文为转载文章 原文地址:https://www.52host.cn/blog/kali-linux-vi-editor/ Kali Linux系统的vi编辑器/vim编辑器的使用和Cent ...
- 将字符串转json时,保持顺序
jo_tmp = json.loads(content.decode('utf-8'), object_pairs_hook=collections.OrderedDict)jo = json.dum ...
- oracle 启动三步骤
oracle 启动三步骤 oracle启动会经过三个过程,分别是nomount.mount.open 一.nomount 阶段 nomount 阶段,可以看到实例已经启动.oracle进程会根据参数文 ...
- Build 2019 彩蛋
N久没写过博客了… 最近在玩 APEX 但是手残党表示打到15级了,至今杀敌 4 人… 当快递员是越来越顺手了… 今年巨硬的 Build 大会会在 5 月 6-8 号召开 新发布的 Hololens ...
- C# DynamicObject 动态对象
dynamic是FrameWork4.0的新特性.dynamic的出现让C#具有了弱语言类型的特性.编译器在编译的时候不再对类型进行检查,编译期默认dynamic对象支持你想要的任何特性.比如,即使你 ...
- Cocos Creator Animation 组件
使用脚本控制动画 Animation 组件 Animation 组件提供了一些常用的动画控制函数,如果只是需要简单的控制动画,可以通过获取节点的 Animation 组件来做一些操作. 播放 var ...
- FreeBSD 与中文
$ setenv LC_ALL en_US.UTF- 然后用 locale 检查 en_US 不是重点,重点是 UTF-8 . 然后用 putty,原因是默认终端又没有中文字体...然后就能输入输出中 ...
- python生成pdf报告、python实现html转换为pdf报告
1.先说下html转换为pdf:其实支持直接生成,有三个函数pdfkit.f 安装python包:pip Install pdfkit 系统安装wkhtmltopdf:参考 https://githu ...