【问题标题】:Find the number that is present in array only once using bitwise operators使用按位运算符查找数组中仅存在一次的数字
【发布时间】:2016-10-28 11:49:35
【问题描述】:

如果我们有一个数组,其中包含在那里出现两次的数字和一个只出现一次的数字,我们可以使用 XOR 运算符来找到它,因为它遵循交流法则。例如

1 2 3 2 3 
1 ^ 2 ^ 3 ^ 2 ^ 3 = ( 2 ^ 2 ) ^ ( 3 ^ 3 ) ^ 1 = 1

但是我们可以使用按位技巧来找到在数组中出现一次的数字,而其他数字可以出现 n 次,n > 1 吗?

【问题讨论】:

  • 可以肯定的是,它只有在n % 2 == 0 时才有效。
  • @NathanOliver 是的,它们只有成对出现时才会相互抵消。这就像负数相乘:2、4 或 6 个负数得到一个正数,因为符号相互抵消。 3、5 或 7 个负数,每个都有一个“悬空”负数,用于最终输出。

标签: c++ arrays bitwise-operators


【解决方案1】:

有一种方法可以做到这一点,但不能使用二元运算符。您可以将每个数字表示为位向量,然后使用 sum (mod n) 将所有向量相加。结果向量将代表那个唯一的数字。

例如,让我们考虑 n=3 和序列 2 3 5 2 5 5 2

向量是:[0 1 0][0 1 1][1 0 1][0 1 0][1 0 1][1 0 1][0 1 0]

所有向量的每元素总和为:[3 4 4]

Mod 3 将是:[0 1 1] 相当于 3 - 序列中的唯一元素。

这是 XOR 技巧的概括;事实上 XOR 正是这种操作 - 在 mod 2 中求和。

【讨论】:

    【解决方案2】:

    对于位运算符,不,除非n 总是偶数。

    但是还有很多其他方法可以使用,例如对出现一次的项目进行排序和扫描,或者如果输入域受到某种限制,则将每个项目分配给存储桶。

    以第一个为例:

    def findASingle(list):
        if list length is zero:
            return nothing
        if list length is one:
            return first item in list
        sort list
        for each item in last other than first and last:
            if item is different to both previous and next item:
                return item
    

    并且,对于第二个,假设它仅限于(例如)个位数的非负整数:

    def findASingle(list):
        create count[0..9], all set to zero
        for each item in last:
            count[item] = count[item] + 1
        for each index 0 through 9 inclusive:
            if count[index] is 1:
                return index
        return nothing
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      相关资源
      最近更新 更多