【剑指Offer学习】【面试题40:数组中只出现一次的数字】

2018-02-11  本文已影响51人  林大鹏

题目:

一个整型数组里除了两个数字之外,其他的数字都出现了两次,请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)

解题思路:

实现代码

#import <Foundation/Foundation.h>


/**
 找到 第一个 位 为1 位索引

 @param num 异或 之后的数
 @return 位索引
 */
int findFirstOneBit (int num) {
    int tmpIndex = 0;
    while ((num & 1) == 0 && tmpIndex < 32) {
       num = num >> 1;
        
       tmpIndex++;
    }
    return tmpIndex;
}


/**
 判断 当前数组num 在位索引 位置 是否 为1

 @param num 数字
 @param indexBit 位索引
 @return 返回 是否
 */
BOOL isBitOne (int num, int indexBit){
    num = num >> indexBit;
    return (num & 1) == 1;
}

/**
 找到 数组 中 只出现 一次 的数字

 @param numArray 数组
 @param numLength 数组 长度
 */
void findNumbersAppearanceOnce(int *numArray, int numLength) {
    
    int result[2]  = {0, 0};

    
    
    if (numArray == NULL) {
        return ;
    }
    if (numLength == 0) {
        return ;
    }
    
    int xorValue = 0;
    // 将 所有的值 进行异或
    for (int tmpIndex = 0; tmpIndex < numLength; tmpIndex++) {
        xorValue ^= numArray[tmpIndex];
    }
    
    // 找到 抑或 之后 第一位 位值为1的 下标 索引
    int indexOfOne = findFirstOneBit(xorValue);
    
    // 将 数组 分成 两部分
    for(int tmpIndex = 0; tmpIndex < numLength; tmpIndex++){
        if (isBitOne(numArray[tmpIndex], indexOfOne)) {
            result[0] ^= numArray[tmpIndex];
        }
        else {
            result[1] ^= numArray[tmpIndex];
        }
    }
   
    for (int tmpIndex = 0; tmpIndex < 2; tmpIndex++) {
        printf("%d ", result[tmpIndex]);
    }
}

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        int data1[8]  = {2, 4, 3, 6, 3, 2, 5, 5};
         findNumbersAppearanceOnce(data1, 8);
    }
    return 0;
}

上一篇 下一篇

猜你喜欢

热点阅读