【算法】落单元素查找

描述

整型数组中除一个元素外其它元素都重复出现 n 次,找出落单的元素,需保证时间复杂度在 O(n) 以内。

考虑 n = 2, n = 3 的情形;
考虑除了一个元素出现 m 次,其它元素出现 n 次的情形, 其中 m != n。

示例:

给定数组 array = [1, 1, 1, 11, 11, 3, 3, 3, 4, 4, 4], 所以 m=2, n=3, 查找到目标元素为 11。

Delphi 算法 【狄泰软件学院】

/*
 * @param array 目标数组
 * @param len 数组元素个数
 * @param n 普通元素出现次数
 * @return 查找到的特殊出现次数的元素值
 * */
int find(int array[], int len, int n)
{
    int ret = 0;

    for (int i=0, tmp = 0; i<32; ++i, tmp=0)
    {
        for (int j=0; j> i) & 0x01;
        }

        ret |= !!(tmp % n) << i;
    }
    
    return ret;
}

原理

将目标数组分解为二进制矩阵后进行组合。

【算法】落单元素查找_第1张图片

==> 数组中各元素 [0-31] 位累加

image.png

==> 累加和取余普通元素出现次数

image.png

==> 非0值转化为1

image.png

==> 转换为 int
11

你可能感兴趣的:(c++,c)