• 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?

    普通解

    刚看到的这个题目第一时间想到的就是a[i]++,最后找出a[i]==1的方法,但一方面python的数组操作没有那么灵活,再就是负数部分不好处理,想了一会儿比较好的方法应该是有一个容器,第一次遇到该值时将其放进去,第二次遇到时就将该值取出,这样整个输入结束后容器中就只剩下我们要的single number了,时间复杂度也只是O(n),列表在不知道索引的情况下不方便移除指定数据,而set中的remove方法则刚好适合,所以最终代码如下:

    class Solution:
        def singleNumber(self, nums: List[int]) -> int:
            single = set()
            
            for num in nums:
                if num in single:
                    single.remove(num)
                else:
                    single.add(num)
            for num in single:
                return num
    

    不使用额外空间的解

    提示里面提醒我们能不能不使用额外的内存就实现它,在不增加时间的情况下百思不得其解,后来看到了讨论区大神的解答才知道可以用异或的方法来做,也更新了我对异或的理解(原本以为异或只适用于0和1)。首先介绍下异或,异或操作最基本的就是

    0 XOR n = n
    n XOR n = 0
    

    同时异或还具有一大特点就是其可交换性,即

    a xor b xor c 三者可以任意交换结果不变
    

    所以将所有输入的值异或再交换,即可得到single number,代码如下

    class Solution:
        def singleNumber(self, nums: List[int]) -> int:
            xor = 0
            for i in range(len(nums)):
                xor ^= nums[i]
            return xor
    
  • 相关阅读:
    MySQL数据库返回影响行数的实际操作流程
    nslookup命令
    Mysql Strict Mode
    mysql表大小写
    Objective-C消息转发
    NSDateFormatter 和 NSDateComponents 的用法
    提交app的时候总是报出icon的错误
    IOS 的loadView 及使用loadView中初始化View注意的问题。(死循环并不可怕)
    [[NSMutableArray alloc] init];和[[NSMutableArray alloc] initWithCapacity:0]区别
    NSMutableArray初始化崩溃问题
  • 原文地址:https://www.cnblogs.com/chuaner/p/11556783.html
Copyright © 2020-2023  润新知