`

【LeetCode】- Single Number(从数组中找出只出现一次的数字)

 
阅读更多

[问题:]

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 - 位运算处理数组中的数 - 代金桥 - 博客园1

    LeetCode上的Single Number II问题就是一个典型的例子,它考察了如何利用位运算找出数组中出现一次的整数。本文将深入探讨这个问题,并扩展到更广泛的场景,包括找出出现两次和多次的整数。 首先,我们来看Single ...

    leetcode-cpp刷题

    - 找出数组中只出现一次的数字,其余数字均出现三次。 - 实现思路:位操作,利用位掩码记录每位出现次数。 - **2.2 单链表** - **2.2.1 Add Two Numbers** - 两个链表表示的大数相加。 - 实现思路:模拟加法...

    算法-leetcode-剑指offer上的题很多

    - **单一数字问题(Single Number)**: 找出数组中唯一的不重复的数字。 - **快乐数(Happy Number)**: 判断一个数字是否快乐。 - **二进制中的1的个数(Count 1 in Binary)**: 计算一个整数的二进制表示中有多少个1。 ...

    python-leetcode面试题解之第136题只出现一次的数字-题解.zip

    找出只出现了一次的那个元素。注意,你的算法应该具有线性时间复杂度和常数空间复杂度。 这是一个经典的位操作问题,考察了对位运算的理解以及在解决问题时的思维灵活性。 Python解决方案: Python中可以利用异或...

    php-leetcode题解之只出现一次的数字.zip

    在本压缩包“php-leetcode题解之只出现一次的数字.zip”中,主要包含的是使用PHP语言解决LeetCode上的一道经典问题——找到数组中只出现一次的数字。这是一道关于数组处理和算法理解的题目,对于提升PHP编程能力和...

    python-leetcode面试题解之第137题只出现一次的数字II-题解.zip

    在本压缩包中,我们关注的是一个Python编程与LeetCode面试相关的题目——“只出现一次的数字II”(Single Number II)。这是一道常见的数据结构与算法问题,常常出现在求职面试中,对于考察应聘者对位操作、哈希表...

    只出现一次的数字(分组+异或)1

    题目 "只出现一次的数字(分组+异或)1" 是 LeetCode 上的一个经典算法问题,要求在给定的整数数组 `nums` 中找出仅出现一次的两个元素。数组中其他元素均出现两次,返回这两个单次出现的元素,顺序不限。此题的关键...

    Leetcode book刷题必备

    34. Single Number II:找出数组中唯一不出现一次的数字,数组中每个数字出现三次。 【杂项】 35. Spiral Matrix:螺旋遍历矩阵。 36. Integer to Roman:整数转换成罗马数字。 37. Roman to Integer:罗马数字转换...

    只出现一次的数字(统计1个数+取余)1

    标题中的“只出现一次的数字(统计1个数+取余)1”指的是在一个整数数组中,所有元素都出现三次,只有一个元素只出现一次,我们需要找到这个唯一出现一次的元素。这个问题是LeetCode上的一道题目,标签为"leetcode...

    leetcode解题笔记1

    总结,以上知识点主要涉及到了异或运算是如何在算法中应用的,包括寻找数组中只出现一次的元素,查找字符串中的新增字符,优化观光组合得分以及找出数组中只出现一次的两个数字。这些方法都是通过巧妙地利用异或运算...

    leetcode简单+中等题目参考答案java版

    由于数组中每个数字出现两次,除了一个只出现一次的数字外,因此将所有数字进行异或运算,最终的结果就是那个只出现一次的数字。 #### 三、Find the Difference(查找差异) **题目描述:** 给定两个字符串`s`和`t...

    java-leetcode-solutions:一些LeetCode问题的解决方案

    7. **位运算**:用于高效地处理整数,例如在`SingleNumber.java`中找出只出现一次的数字。 8. **设计模式**:如工厂模式、单例模式、观察者模式等。虽然LeetCode主要关注算法,但某些问题可能需要设计合理的类结构...

    LeetCode 算法题库【136】——只出现一次的数字

    这道LeetCode中的算法问题主要考察的是在给定整数数组`nums`中,找到唯一一个只出现一次的数字,而其他所有数字都出现两次。解决这个问题涉及到几种不同的策略,包括排序、数学计算以及位运算。 ### 排列验证法 ...

    leetcode-answer-and-analysis(part).zip_图形图像处理_Java_

    3. **Single Number** (数组中只出现一次的数字): 题目要求找出数组中唯一出现一次的数字,其余数字都出现了两次。这涉及到位运算,可以利用异或操作符在Java中解决这个问题,因为任何数与其自身异或的结果是0,所有...

    leetcode java

    - "只出现一次的数字"(Single Number)题目要求找出数组中只出现一次的元素,其余元素都出现两次。 - "数组中两个数字只出现一次"(Single Number II)则是进一步考察位运算技巧。 ** Miscellaneous(杂项)** ...

    java面试-leetcode面试题解之第66题加一-java题解.zip

    找出那个只出现了一次的元素。要求算法的时间复杂度为O(n),空间复杂度为O(1)。 解题思路: 对于第66题,我们可以利用异或操作的性质来解决。异或操作具有以下两个重要特性: 1. 任何数与0异或都等于本身。 2. 异或...

    python-leetcode面试题解之第220题存在重复元素III-题解.zip

    找出那个只出现了一次的元素。要求算法的时间复杂度为O(n),空间复杂度为O(1)。 ### 解决思路: 1. **哈希表法**:最直观的方法是使用哈希表来统计每个元素出现的次数,但由于题目要求空间复杂度为O(1),这种方法不...

    leetcode338-LeetCode:力码

    只出现一次的数字 III(Single Number III)**:这是一道关于数组和位操作的题目,要求找出数组中唯一一个只出现一次的数字,而其他数字都出现两次。可以利用异或操作实现。 7. **338. 计数质数(Counting Bits)**:...

    Leetcode部分试题解析

    3. **Single Number**:在一个只包含两个重复数字的整数列表中找到唯一的单个数字。利用Python的位运算,可以实现快速查找单数。 4. **Same Tree**:判断两棵树是否结构相同且对应节点值相等。这涉及到深度优先搜索...

    leetcode官方50题算法详解

    2. **位运算中只出现一次的数字(Single Number)**:要求在只使用常数空间的情况下,找出数组中唯一的不重复的数字。 以上只是leetcode官方50题中的部分题目和相关知识点的简要介绍,每道题目均要求面试者具备良好...

Global site tag (gtag.js) - Google Analytics