本篇文章为大家展示了如何处理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<>(); 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; } }
复杂度分析
时间复杂度:O(n+n) = O(n)。 for
循环的时间复杂度是 O(n)。
空间复杂度:O(n)。hashmap需要的空间跟nums中元素个数相等。
执行结果
思路
任何数与0异或为其本身:0 ^ n => n
相同的数异或为0: n ^ n => 0
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; } }
复杂度分析
时间复杂度:O(n)。只需要将nums元素遍历一遍,所以时间复杂度为nums中元素的个数。
空间复杂度:O(1)。
上述内容就是如何处理leetcode136只出现一次的数字,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注亿速云行业资讯频道。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。