zoukankan      html  css  js  c++  java
  • 《剑指offer》第五十六题II:数组中唯一只出现一次的数字

    // 面试题56(二):数组中唯一只出现一次的数字
    // 题目:在一个数组中除了一个数字只出现一次之外,其他数字都出现了三次。请
    // 找出那个吃出现一次的数字。
    
    #include <cstdio>
    #include <exception>
    
    int FindNumberAppearingOnce(int numbers[], int length)
    {
        if (numbers == nullptr || length <= 0)
            throw new std::exception("Invaild Input.");
    
        int bitSum[32] = { 0 };  //存储所有数字二进制每位之和
    
        for (int i = 0; i < length; ++i)  //遍历numbers中所有数字
        {
            int num = numbers[i];
            for (int j = 31; j >= 0; --j)  //遍历每个数字二进制每位
            {
                int result = (num & 1);  //取出当前位
                if (result != 0)
                    bitSum[j] += 1;  //求每位和
                
                num = num >> 1;
            }
        }
    
        int result = 0;
        for (int i = 0; i < 32; ++i)
        {
            result = result << 1;
            result += bitSum[i] % 3;  //能被三整除说明本位是0, 否则为1
            
        }
        return result;
    }
    // ====================测试代码====================
    void Test(const char* testName, int numbers[], int length, int expected)
    {
        int result = FindNumberAppearingOnce(numbers, length);
        if (result == expected)
            printf("%s passed.
    ", testName);
        else
            printf("%s FAILED.
    ", testName);
    }
    
    // 所有数字都是正数,唯一的数字是最小的
    void Test1()
    {
        int numbers[] = { 1, 1, 2, 2, 2, 1, 3 };
        int expected = 3;
        Test("Test1", numbers, sizeof(numbers) / sizeof(int), expected);
    }
    
    // 所有数字都是正数,唯一的数字的大小位于中间
    void Test2()
    {
        int numbers[] = { 4, 3, 3, 2, 2, 2, 3 };
        int expected = 4;
        Test("Test2", numbers, sizeof(numbers) / sizeof(int), expected);
    }
    
    // 所有数字都是正数,唯一的数字是最大的
    void Test3()
    {
        int numbers[] = { 4, 4, 1, 1, 1, 7, 4 };
        int expected = 7;
        Test("Test3", numbers, sizeof(numbers) / sizeof(int), expected);
    }
    
    // 唯一的数字是负数
    void Test4()
    {
        int numbers[] = { -10, 214, 214, 214 };
        int expected = -10;
        Test("Test4", numbers, sizeof(numbers) / sizeof(int), expected);
    }
    
    // 除了唯一的数字,其他数字都是负数
    void Test5()
    {
        int numbers[] = { -209, 3467, -209, -209 };
        int expected = 3467;
        Test("Test5", numbers, sizeof(numbers) / sizeof(int), expected);
    }
    
    // 重复的数字有正数也有负数
    void Test6()
    {
        int numbers[] = { 1024, -1025, 1024, -1025, 1024, -1025, 1023 };
        int expected = 1023;
        Test("Test6", numbers, sizeof(numbers) / sizeof(int), expected);
    }
    
    // 所有数字都是负数
    void Test7()
    {
        int numbers[] = { -1024, -1024, -1024, -1023 };
        int expected = -1023;
        Test("Test7", numbers, sizeof(numbers) / sizeof(int), expected);
    }
    
    // 唯一的数字是0
    void Test8()
    {
        int numbers[] = { -23, 0, 214, -23, 214, -23, 214 };
        int expected = 0;
        Test("Test8", numbers, sizeof(numbers) / sizeof(int), expected);
    }
    
    // 除了唯一的数字,其他数字都是0
    void Test9()
    {
        int numbers[] = { 0, 3467, 0, 0, 0, 0, 0, 0 };
        int expected = 3467;
        Test("Test9", numbers, sizeof(numbers) / sizeof(int), expected);
    }
    
    int main(int argc, char* argv[])
    {
        Test1();
        Test2();
        Test3();
        Test4();
        Test5();
        Test6();
        Test7();
        Test8();
        Test9();
    
        return 0;
    }
    测试代码

    分析:分析位运算。

  • 相关阅读:
    Candy leetcode java
    Trapping Rain Water leetcode java
    Best Time to Buy and Sell Stock III leetcode java
    Best Time to Buy and Sell Stock II leetcode java
    Best Time to Buy and Sell Stock leetcode java
    Maximum Subarray leetcode java
    Word Break II leetcode java
    Word Break leetcode java
    Anagrams leetcode java
    Clone Graph leetcode java(DFS and BFS 基础)
  • 原文地址:https://www.cnblogs.com/ZSY-blog/p/12660429.html
Copyright © 2011-2022 走看看