继续刷Leetcode,第18篇

继续刷Leetcode,第18篇_第1张图片

一、写在前面

LeetCode 第十六和十七题螺旋矩阵传输门:

二、今日题目

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。说明:线性时间复杂度。 你可以不使用额外空间来实现吗?

实例

示例 1:

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

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

三、 分析

这个题目,看着还是比较简单的,列表里只有一个元素是单独存在的,其他元素都是成对存在(着实虐狗啊),那么怎么把这个狗找出来了,我最开始想到了之前用到的一个列表元素计数的模块collectionsCounter方法,返回一个字典,key是元素值,vaule是该元素出现的次数,我直接判断vaule是不是等于一就好了,然后返回对应的key值,这样就有了方法一,当然还有其他方法,具体看下面的解题部分,大概思路如下:

继续刷Leetcode,第18篇_第2张图片 老表亲自手写

四、解题

1. 第一眼想到的,Counter函数:

表面上看,时间复杂度:O(n)

(1)代码
class Solution(object):
    def singleNumber(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        # 导入计数模块
        from collections import Counter
        count = Counter(nums)
        # 返回的是个字典对象
        # key : 原列表元素
        # vaules : 对应元素出现次数
        for k, v in count.items():
            # 遍历列表找到答案
            if v == 1:
                return k
(2)提交结果
继续刷Leetcode,第18篇_第3张图片

测试数据:16组

2.根据规律之一:

根据题目,所有元素只有一个元素单个存在(下面把它称为目标元素),其他元素均成对存在,所以易推测元素个数为奇数个,并且如果把列表排序后,目标元素的索引下标必然为偶数(列表索引从0开始,排序后其他相同元素必然是0,1,在前面或者后面可能是目标元素,所以目标元素的索引必然为偶数),那么我们只需要用偶数项的和减去奇数项的和即可找出目标元素值。

时间复杂度:O(n)

(1)代码
class Solution(object):
    def singleNumber(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        # 排序
        nums.sort()
        temp = nums[0]
        # for循环遍历,作差,遍历一半即可
        for i in range(len(nums)//2):
            # 偶数下标减奇数下标,并计算差的和
            temp = temp - nums[2*i+1] + nums[2*i+2]
        return temp
(2)提交结果
继续刷Leetcode,第18篇_第4张图片

测试数据:16组

额外知识:
继续刷Leetcode,第18篇_第5张图片 十大排序算法,图片来自互联网博客
3.根据规律之二:

我们现在要做的就是开心连连看游戏,相同的数据应该连接后消失,等所有相同元素都已经被连接消失后,自然就只剩下我们要找的目标元素了,根据数学逻辑,这里的连连看-消失的功能我们可以用逻辑异或来实现,相同的元素异或,结果为0,不同的元素异或按位进行异或操作(二进制),任何元素与0进行异或结果为它自己,根据思想实现代码如下。

(1)代码
class Solution(object):
    def singleNumber(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        flag = 0  # 起始数
        for i in range(len(nums)):
            # 异或找不同元素  ^ 为Python里的异或标识
            flag = flag ^ nums[i]
        return flag
(2)运行结果
继续刷Leetcode,第18篇_第6张图片

测试数据:16组

额外知识
继续刷Leetcode,第18篇_第7张图片 图片来自菜鸟教程

五、疑惑

今日分享:如果你处于和我一样“比上不足,比下有余”的地方,我建议你两点:1、承认。

有人比我们优秀是正常的,没有人比我们优秀这才是坏事,如果你发现,你周围的人都不如你优秀,那说明,你现在的环境已经不适合你发展了,当然你可以跳出当前环境或者接触新环境带动当前环境(前者是技术人,后者是领导者)

2、做自己。

完全没必要去和不优秀的人比较,也没必要和特别优秀的人较劲,做好自己,人生漫漫长路,你得一点一点积累,不因小事而停顿,不因大事而搓返。

六、结语

思想很复杂,

我决定了,继续开展留言打卡活动

留言打卡奖励

坚持连续打卡21天,免费进入资源分享群坚持连续打卡64天,获得50元以内赠书一本坚持连续打卡100天,获得100元以内赠书一本坚持连续打卡101天,免费加入老表的知识星球所有奖品一经兑换,打卡天数也自动清零。


/今日留言主题/

你觉得刷Leetcode算法题对你帮助最大的是什么?你愿意和我一起刷Leetcode吗?

(留言格式:Dayxx:blahblah

字数限制:15 字以上.)

640?

觉得文章不错,帮忙转发一下,谢谢

你可能感兴趣的:(继续刷Leetcode,第18篇)