如何处理leetcode136只出现一次的数字

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

泾源网站建设公司创新互联建站,泾源网站设计制作,有大型网站制作公司丰富经验。已为泾源数千家提供企业网站建设服务。企业网站搭建\外贸网站制作要多少钱,请找那个售后服务好的泾源做网站的公司定做!

“好”算法的标准

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

运行效率体现在两方面:

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

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

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

描述

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

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

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

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

题解

  • 思路

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

  • 代码实现

class Solution {
    public int singleNumber(int[] nums) {
        Map temp = new HashMap<>();

		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中元素个数相等。

  • 执行结果

如何处理leetcode136只出现一次的数字

最优解:位操作

  • 思路

  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只出现一次的数字

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


当前标题:如何处理leetcode136只出现一次的数字
网站网址:http://pwwzsj.com/article/jgspdi.html