我认为标题可能有点误导,但我想不出更好的标题。 我有一个数组A [],除了其中一个元素之外的所有元素都出现了15次的倍数,例如2次发生30次,3次发生45次。但是一个元素出现x次,其中x不是15的倍数。如何打印数字x。我正在寻找没有哈希表的线性解决方案。
感谢。
答案 0 :(得分:7)
这里有类似的问题,在StackOverflow上,但我找不到它。
让我们使用3而不是15,因为它会更容易,我认为它完全相同。序列为4, 5, 4, 5, 3, 3, 4, 5
,二进制100, 101, 100, 101, 11, 11, 100, 101
。
您可以执行以下操作:将所有值与最低有效位数相加并取余数超过3(最初为15):
bit1 = (0 + 1 + 0 + 1 + 1 + 1 + 0 + 1) % 3 = 5 % 3 = 2 != 0
如果它是!= 0
那么我们试图找到的那个数字等于1。现在让我们转到下一个:
bit2 = (0 + 0 + 0 + 0 + 1 + 1 + 0 + 0) % 3 = 2 % 3 = 2 != 0
bit3 = (1 + 1 + 1 + 1 + 0 + 0 + 1 + 1) % 3 = 6 % 3 = 0 == 0
所以我们bit3 == 0, bit2 != 0, bit1 != 0
,011
。转换为十进制:3
。
空间复杂度为O(1)
,时间复杂度为O(n * BIT_LENGTH_OF_VARS)
,其中BIT_LENGTH_OF_VARS == 8
表示字节,BIT_LENGTH_OF_VARS == 32
表示int等。因此它可能很大,但常量不是不会影响渐近行为,而O(n * BIT_LENGTH_OF_VARS)
确实是O(n)
。
就是这样!