Python学习02——位运算——涨知识

学习内容

今天进行位运算学习。通常进行数值运算过程中,为了符合人类常用习惯,选取10进制方式。而对于计算机而言,数据在其内部的存储的最小单元为bit其值为01。故其运算选取2进制方式。其实数据不管何种表达形式 都有其运算法则,常见的四则运算、逻辑运算等。同样为了方便计算运行,对2进制数据设计了相应的运算法则,包括:

名称操作符
按位非~
按位与&
按位或|
按位异或^
按位左移<<
按位右移>>

学习过程中发现一个比较秒的操作,使用按位异或操作,可以在没有第3个中间变量的参与下实现两个整数的交换

a ^= b
b ^= a
a ^= b

这个算法很神奇,之前没有注意到过,算是涨知识了。

习题

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

说明:

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

示例 1:

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

示例 2:

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

思路

  1. 数据是以数组,列表的形式进行存储。
  2. 采用按位异或操作可以筛选出相同的元素。
  3. 采用循环查找方式。
    1. 循环查找过程中设立一个标志位
    2. 当找到相同元素后,将相同元素从列表中移除,同时将标志位置
    3. 判断标志位是否为
      1. ,说明该元素为唯一元素
      2. ,循环查找下一个元素,直至列表长度为1

解题:

class Solution:
    def singleNumber(self, nums: List[int]) -> int:
        while len(nums)!=1:
            data1 = nums[0]
            datas = nums[1:]
            flg = False
            for data2 in datas:
                if data1^data2==0:
                    nums.remove(data1)
                    nums.remove(data2)
                    flg = True
                    break
            if (flg == False):
                break
        return nums[0]

引用

  1. https://leetcode-cn.com/problems/single-number
  2. https://github.com/datawhalechina/team-learning-program/blob/master/Python-Language/02.%20%E4%BD%8D%E8%BF%90%E7%AE%97.md
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页