[问题:]
Given an array of integers, every element appearstwiceexcept
for one. Find that single one.
Note:Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?
翻译:给定一个整数数组,数组中所有元素都出现了两次,只有一个元素只出现了一次,找出这个只出现了一次的元素。
[
解法:]
①. 常规解法:时间复杂度为O(n²),没能通过
/**
* Time Limit Exceeded
* 时间复杂度为:O(n²),无法通过
*/
public class Solution1 {
public int singleNumber(int[] arr) {
int count = 0;
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr.length; j++) {
if (arr[i] == arr[j]) {
count++;
}
}
if (count == 1) {
return arr[i];
} else {
count = 0;
}
}
return -1;
}
public static void main(String[] args) {
int[] arr = { 0, 1, 1, 2, 2, 3, 0 };
System.out.println(new Solution1().singleNumber(arr));
}
}
②. 标准解法:使用异或运算
这个程序用了个小技巧:一个整数和它本身异或之后得到值是0,0与其他整数异或得到的是这个整数本身
/**
* 利用异或的可交换性
*/
public class Solution2 {
public int singleNumber(int[] arr) {
// invalid check
if (arr.length == 0) {
return -1;
}
int result = 0;
for (int i = 0; i < arr.length; i++) {
result = result ^ arr[i];
}
return result;
}
public static void main(String[] args) {
int[] arr = { 0, 1, 1, 2, 2, 3, 0 };
System.out.println(new Solution2().singleNumber(arr));
}
}
[ 拓展:]
异或运算的两个法则:
①.a ^ b = b ^ a
②. a ^ b ^ c = a ^ (b ^ c) = (a ^ b) ^ c
真^
假 = 真 假^
真 = 真 假^ 假
= 假 真^ 真 = 假
/**
* 不使用第三个变量,交换两个变量的值
*/
public class Swap {
public static void main(String[] args) {
int a = 1, b = 2;
System.out.println("交换前: a = " + a + " , b = " + b);
a = a ^ b;
b = a ^ b;
a = a ^ b;
System.out.println("交换后: a = " + a + " , b = " + b);
}
}
分享到:
相关推荐
LeetCode上的Single Number II问题就是一个典型的例子,它考察了如何利用位运算找出数组中出现一次的整数。本文将深入探讨这个问题,并扩展到更广泛的场景,包括找出出现两次和多次的整数。 首先,我们来看Single ...
- 找出数组中只出现一次的数字,其余数字均出现三次。 - 实现思路:位操作,利用位掩码记录每位出现次数。 - **2.2 单链表** - **2.2.1 Add Two Numbers** - 两个链表表示的大数相加。 - 实现思路:模拟加法...
- **单一数字问题(Single Number)**: 找出数组中唯一的不重复的数字。 - **快乐数(Happy Number)**: 判断一个数字是否快乐。 - **二进制中的1的个数(Count 1 in Binary)**: 计算一个整数的二进制表示中有多少个1。 ...
找出只出现了一次的那个元素。注意,你的算法应该具有线性时间复杂度和常数空间复杂度。 这是一个经典的位操作问题,考察了对位运算的理解以及在解决问题时的思维灵活性。 Python解决方案: Python中可以利用异或...
在本压缩包“php-leetcode题解之只出现一次的数字.zip”中,主要包含的是使用PHP语言解决LeetCode上的一道经典问题——找到数组中只出现一次的数字。这是一道关于数组处理和算法理解的题目,对于提升PHP编程能力和...
在本压缩包中,我们关注的是一个Python编程与LeetCode面试相关的题目——“只出现一次的数字II”(Single Number II)。这是一道常见的数据结构与算法问题,常常出现在求职面试中,对于考察应聘者对位操作、哈希表...
题目 "只出现一次的数字(分组+异或)1" 是 LeetCode 上的一个经典算法问题,要求在给定的整数数组 `nums` 中找出仅出现一次的两个元素。数组中其他元素均出现两次,返回这两个单次出现的元素,顺序不限。此题的关键...
34. Single Number II:找出数组中唯一不出现一次的数字,数组中每个数字出现三次。 【杂项】 35. Spiral Matrix:螺旋遍历矩阵。 36. Integer to Roman:整数转换成罗马数字。 37. Roman to Integer:罗马数字转换...
标题中的“只出现一次的数字(统计1个数+取余)1”指的是在一个整数数组中,所有元素都出现三次,只有一个元素只出现一次,我们需要找到这个唯一出现一次的元素。这个问题是LeetCode上的一道题目,标签为"leetcode...
总结,以上知识点主要涉及到了异或运算是如何在算法中应用的,包括寻找数组中只出现一次的元素,查找字符串中的新增字符,优化观光组合得分以及找出数组中只出现一次的两个数字。这些方法都是通过巧妙地利用异或运算...
由于数组中每个数字出现两次,除了一个只出现一次的数字外,因此将所有数字进行异或运算,最终的结果就是那个只出现一次的数字。 #### 三、Find the Difference(查找差异) **题目描述:** 给定两个字符串`s`和`t...
7. **位运算**:用于高效地处理整数,例如在`SingleNumber.java`中找出只出现一次的数字。 8. **设计模式**:如工厂模式、单例模式、观察者模式等。虽然LeetCode主要关注算法,但某些问题可能需要设计合理的类结构...
这道LeetCode中的算法问题主要考察的是在给定整数数组`nums`中,找到唯一一个只出现一次的数字,而其他所有数字都出现两次。解决这个问题涉及到几种不同的策略,包括排序、数学计算以及位运算。 ### 排列验证法 ...
3. **Single Number** (数组中只出现一次的数字): 题目要求找出数组中唯一出现一次的数字,其余数字都出现了两次。这涉及到位运算,可以利用异或操作符在Java中解决这个问题,因为任何数与其自身异或的结果是0,所有...
- "只出现一次的数字"(Single Number)题目要求找出数组中只出现一次的元素,其余元素都出现两次。 - "数组中两个数字只出现一次"(Single Number II)则是进一步考察位运算技巧。 ** Miscellaneous(杂项)** ...
找出那个只出现了一次的元素。要求算法的时间复杂度为O(n),空间复杂度为O(1)。 解题思路: 对于第66题,我们可以利用异或操作的性质来解决。异或操作具有以下两个重要特性: 1. 任何数与0异或都等于本身。 2. 异或...
找出那个只出现了一次的元素。要求算法的时间复杂度为O(n),空间复杂度为O(1)。 ### 解决思路: 1. **哈希表法**:最直观的方法是使用哈希表来统计每个元素出现的次数,但由于题目要求空间复杂度为O(1),这种方法不...
只出现一次的数字 III(Single Number III)**:这是一道关于数组和位操作的题目,要求找出数组中唯一一个只出现一次的数字,而其他数字都出现两次。可以利用异或操作实现。 7. **338. 计数质数(Counting Bits)**:...
3. **Single Number**:在一个只包含两个重复数字的整数列表中找到唯一的单个数字。利用Python的位运算,可以实现快速查找单数。 4. **Same Tree**:判断两棵树是否结构相同且对应节点值相等。这涉及到深度优先搜索...
2. **位运算中只出现一次的数字(Single Number)**:要求在只使用常数空间的情况下,找出数组中唯一的不重复的数字。 以上只是leetcode官方50题中的部分题目和相关知识点的简要介绍,每道题目均要求面试者具备良好...