如何处理leetcode136只出现一次的数字
更新:HHH   时间:2023-1-7


本篇文章为大家展示了如何处理leetcode136只出现一次的数字,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

“好”算法的标准

对于一个问题的算法来说,之所以称之为算法,首先它必须能够解决这个问题(称为准确性)。其次,通过这个算法编写的程序要求在任何情况下不能崩溃(称为健壮性)。如果准确性和健壮性都满足,接下来,就要考虑最重要的一点:通过算法编写的程序,运行的效率怎么样。

运行效率体现在两方面:

  • 算法的运行时间。(称为“时间复杂度”)

  • 运行算法所需的内存空间大小。(称为“空间复杂度”)

好算法的标准就是:在符合算法本身的要求的基础上,使用算法编写的程序运行的时间短,运行过程中占用的内存空间少,就可以称这个算法是“好算法”。

描述

> 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

说明: 你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

示例 1: 输入: [2,2,1] 输出: 1

示例 2: 输入: [4,1,2,1,2] 输出: 4

题解

  • 思路

使用额外HashMap来存储每一个数组元素,最后取出个数为1的那一个(看到题目,实在没有啥好思路,这个方法运行效率肯定非常低)

  • 代码实现

class Solution {
    public int singleNumber(int[] nums) {
        Map<integer, integer> temp = new HashMap&lt;&gt;();

		for (int i : nums) {
			temp.put(i, temp.get(i) == null ? 1 : temp.get(i) + 1);
		}
		for (int i : nums) {
			if (temp.get(i) == 1) {
				return i;
			}
		}
		return 0;
    }
}
  • 复杂度分析

  1. 时间复杂度:O(n+n) = O(n)。 for 循环的时间复杂度是 O(n)。

  2. 空间复杂度:O(n)。hashmap需要的空间跟nums中元素个数相等。

  • 执行结果

最优解:位操作

  • 思路

  1. 任何数与0异或为其本身:0 ^ n => n

  2. 相同的数异或为0: n ^ n => 0

  3. XOR(异或) 满足交换律和结合律:a ^ b ^ a = (a ^ a) ^ b = 0 ^ b = b

所以我们只需要将所有的数进行 XOR 操作,得到那个唯一的数字。

  • 代码实现

class Solution {
    public int singleNumber(int[] nums) {
        int result = 0;
        for(int i : nums) {
            result^=i;
        }
        return result;
    }
}
  • 复杂度分析

  1. 时间复杂度:O(n)。只需要将nums元素遍历一遍,所以时间复杂度为nums中元素的个数。

  2. 空间复杂度:O(1)。

执行结果

上述内容就是如何处理leetcode136只出现一次的数字,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注天达云行业资讯频道。

返回大数据教程...