异或操作

来源:互联网 发布:请假流程数据库设计 编辑:程序博客网 时间:2024/05/17 05:59

  • 1至1000里面只有一个重复,现在需要找出这个数
  • 一个数组中只有一个数字发生了一次,其他的都是两次,找出这个数字
  • 一个数组中有两个数发生了一次,其他的都是两次,找出这两个数

  • 这里这个题目都是用抑或操作来处理数组里面的数据。

    主要是下面这个公式

    // NOTICE : B = A ^ (B ^ A)

    第一题

    直接上代码了

    #include <iostream>#include <cstring>#include <cstdlib>const int N = 10;int main(){    int arr[N];    int len = sizeof(arr) / sizeof(int);    int i = 0;    int res = 0;    for (i = 0; i < N; i++)    {        arr[i] = i + 1;        if (i == 0)            res = i + 1;        else            res ^= i + 1;    }    int arr_data[N+1] = {1, 3, 5, 7, 9, 10, 2, 3, 4, 6, 8};    for (i = 0; i < N+1; i++)        res ^= arr_data[i];    std::cout << "only repeat number: " << res << std::endl;    return 0;}

    上面将N改为1000即可。


    第二题

    对于第二题,较为容易,对整个数据取异或,剩下的那个值就是发生一次的数。

    #include <iostream>#include <cstring>#include <cstdlib>const int N = 10;void quicksort(int arr[], int low, int high){    if (low >= high)        return;    int i = low;    int j = high;    int val = arr[j];    while (i < j)    {        while (i < j && arr[i] >= val)            i++;        arr[j] = arr[i];        while (i < j && arr[j] < val)            j--;        arr[i] = arr[j];    }    arr[i] = val;    quicksort(arr, low, i-1);    quicksort(arr, i+1, high);}int main(){    int arr[] = {1, 3, 4, 3, 5, 7, 5, 9, 6, 1, 7, 9, 4};    int len = sizeof(arr) / sizeof(int);    int i = 0;    std::cout << "org data:" << std::endl;    for (i = 0; i < len; i++)        std::cout << arr[i] << " ";    std::cout << std::endl;    /*    quicksort(arr, 0, len-1);    std::cout << "sorted data:" << std::endl;    for (i = 0; i < len; i++)        std::cout << arr[i] << " ";    std::cout << std::endl;    */    int res = 0;    for (i = 0; i < len; i++)    {        if (i == 0)            res = arr[i];        else            res ^= arr[i];    }    std::cout << "the only number: " << res << std::endl;    return 0;}


    第三题

    对于第三题,也是一样的,先将这个数组分组,分组以后再来获取相应的值就可以了。

    #include <iostream>#include <cstring>#include <cstdlib>const int N = 10;void quicksort(int arr[], int low, int high){    if (low >= high)        return;    int i = low;    int j = high;    int val = arr[j];    while (i < j)    {        while (i < j && arr[i] >= val)            i++;        arr[j] = arr[i];        while (i < j && arr[j] < val)            j--;        arr[i] = arr[j];    }    arr[i] = val;    quicksort(arr, low, i-1);    quicksort(arr, i+1, high);}int main(){    int arr[] = {1, 3, 4, 3, 5, 7, 5, 9, 6, 1, 12, 7, 9, 4};    int len = sizeof(arr) / sizeof(int);    int i = 0;    std::cout << "org data:" << std::endl;    for (i = 0; i < len; i++)        std::cout << arr[i] << " ";    std::cout << std::endl;    /*    quicksort(arr, 0, len-1);    std::cout << "sorted data:" << std::endl;    for (i = 0; i < len; i++)        std::cout << arr[i] << " ";    std::cout << std::endl;    */    int res = 0;    for (i = 0; i < len; i++)    {        if (i == 0)            res = arr[i];        else            res ^= arr[i];    }    std::cout << "the split number: " << res << std::endl;    int key = 1;    while (1)    {        if (key & res)            break;        else            key <<= 1;    }    std::cout << "the key is " << key << std::endl;    int number1 = 0;    int number2 = 0;    for (i = 0; i < len; i++)    {        if (arr[i] & key) {            if (number1 == 0)                number1 = arr[i];            else                 number1 ^= arr[i];        } else {            if (number2 == 0)                number2 = arr[i];            else                number2 ^= arr[i];        }    }    std::cout << "the number which happens once: " << number1 << ", " << number2 << std::endl;    return 0;}
    原创粉丝点击