Leetcode Single Number python 学习异或,reduce函数,内置operator模块。

Leetcode 136.Single Number
Given a non-empty array of integers, every element appears twice except for one. Find that single one.

Note:

Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?

Example 1:

Input: [2,2,1]
Output: 1
Example 2:

Input: [4,1,2,1,2]
Output: 4

题目大意: 给出一个数组,里面有很多二次重复的数字,有且只有一个单次重复的数字,返回这个单次重复的数字。


拿到题目的时候懵了,觉得很简单,但是复杂度就是不符合要求。
其实这道题的解法有很多。
不过这道题是让读者联系异或运算。我也学习了一下。总结再次。
什么是异或?
粗浅的理解,异或就是:相同为假,不同为真。
自然界中,一男一女才可以生孩子。

精准的理解是:异或是对两个数的二进制,进行‘相同为假,不同为真’的操作。即:0^0=0, 1^1=0, 1^0=1, 0^1=1. 的操作。

继续深刻的理解:应用上,异或有三个性质。

 异或的性质:

    1、交换律:a^b = b^a;

    2、结合律:(a^b)^c = a^(b^c);

    3、对于任意的a:a^a=0,a^0=a,a^(-1)=~a。

能做消重等很多事情。

所以以此题为例:
若给出:
nums=[4,1,2,1,2]–>交换率=[4,1,1,2,2]–>结合律=[4,(1,1),(2,2)]
另外,数字异或本身等于0,0异或任意数字等于数字本身。
故直接给出代码。

方案1

class Solution:
    def singleNumber(self, nums: List[int]) -> int:
        res = 0
        for i in nums:
            res ^= i
        return res
        

精简代码,方案二:
reduce()函数。
什么是reduce函数?
将函数计算出来的结果迭代回函数继续参与计算。
严谨来说是:
reduce() 函数会对参数序列中元素进行累积。

函数将一个数据集合(链表,元组等)中的所有数据进行下列操作:用传给 reduce 中的函数 function(有两个参数)先对集合中的第 1、2 个元素进行操作,得到的结果再与第三个数据用 function 函数运算,最后得到一个结果。
reduce语法为:
reduce(function, iterable[, initializer])
function – 函数,有两个参数
iterable – 可迭代对象
initializer – 可选,初始参数
几个学习reduce函数的例子:

>>>def add(x, y) :            # 两数相加
...     return x + y
... 
>>> reduce(add, [1,2,3,4,5])   # 计算列表和:1+2+3+4+5
15
>>> reduce(lambda x, y: x+y, [1,2,3,4,5])  # 使用 lambda 匿名函数
15

故得出方案二:

class Solution(object):
    def singleNumber(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        return reduce(lambda x, y: x^y, nums)

方案三: 使用Python中内置的operator模块。 我用Python这么久,也是第一次知道这个模块。学习了。

class Solution:
    def singleNumber(self, nums: List[int]) -> int:
        return reduce(operator.xor,nums)

另外附上operator的官方使用说明。
https://docs.python.org/zh-cn/3/library/operator.html

2020/03/16
英国,最近国内国外研究课题很多。
加油!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值