寻找数组中出现奇数次的字符

LeetCode.136

问提描述

数组中的字符只有一个字符出现次数是奇数次,其他字符出现次数都是偶数次;
想办法找出出现偶数次的那个函数;
要求:时间复杂度为线性增加;不额外增加空间;

可想到的方法:

  1. 暴力遍历两次,时间复杂度o(n^2);
  2. 使用字典存储每个值的数量,返回数量为奇数的值,时间复杂度o(n^2), 空间复杂度o(n);
  3. 使用异或的方法,因为异或运算具有交换律 “a异或b异或c” 等价于 “a异或c异或b”,把数组所有的元素进行异或运算,最后剩下的元素为奇数数量的元素;该方法满足时间复杂度为o(n^2),没有使用额外的空间;

简单介绍异或运算

异或运算是用于二进制计算的,二进制每一位上相等为0,相异为1。例如:2异或3,使用二进制表示:0010 异或 0011 得到 0001 即 1,所以2^3 = 1。

方法实现

input0 = [2,2,1] # out: 1
input1 = [4,1,2,1,2] # out:^ 4

def single_number(input_):
    a = input_[0]
    if input_.__len__()>1:          # 记住判断数组长度,确定边界;
        for i in range(1,input_.__len__()):
            a = a ^ input_[i]
    else: return a
    return a
single_number(input0)
1
single_number(input1)
4
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值