数字数组

3、【剑指Offer学习】【面试题03:找出数组中重复的数字】

4、【剑指Offer学习】【面试题04:二维数组中的查找】

11、【剑指Offer学习】【面试题11:旋转数组的最小数字】

16、【剑指Offer学习】【面试题16:数值的整数次方】

21、【剑指Offer学习】【面试题21:调整数组顺序使奇数位于偶数前面】

39、【剑指Offer学习】【面试题39:数组中出现次数超过一半的数字】

42、【剑指Offer学习】【面试题42:连续子数组的最大和】

43、【剑指Offer学习】【面试题43:从1到n整数中1出现的次数】

44、【剑指Offer学习】【面试题44:数字序列中某一位的数字】

45、【剑指Offer学习】【面试题45:把数组排成最小的数】

51、【剑指Offer学习】【面试题51:数组中的逆序对】

53、【剑指Offer学习】【面试题53:数字在排序数组中出现的次数】

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

57、【剑指Offer学习】【面试题57:和为s的两个数字】

62、【剑指Offer学习】【面试题62:圆圈中最后剩下的数字】

66、【剑指Offer学习】【面试题66:构建乘积数组】

3. 面试题03:找出数组中重复的数字

        /*******************************************************************
        Copyright(c) 2016, Harry He
        All rights reserved.

        Distributed under the BSD license.
        (See accompanying file LICENSE.txt at
        https://github.com/zhedahht/CodingInterviewChinese2/blob/master/LICENSE.txt)
        *******************************************************************/

        //==================================================================
        // 《剑指Offer——名企面试官精讲典型编程题》代码
        // 作者:何海涛
        //==================================================================

        // 面试题3(一):找出数组中重复的数字
        // 题目:在一个长度为n的数组里的所有数字都在0到n-1的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,
        // 也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。例如,如果输入长度为7的数组{2, 3, 1, 0, 2, 5, 3},
        // 那么对应的输出是重复的数字2或者3。

        #include <cstdio>

        // &#x53C2;&#x6570;:
        //        numbers:     &#x4E00;&#x4E2A;&#x6574;&#x6570;&#x6570;&#x7EC4;
        //        length:      &#x6570;&#x7EC4;&#x7684;&#x957F;&#x5EA6;
        //        duplication: (&#x8F93;&#x51FA;) &#x6570;&#x7EC4;&#x4E2D;&#x7684;&#x4E00;&#x4E2A;&#x91CD;&#x590D;&#x7684;&#x6570;&#x5B57;
        // &#x8FD4;&#x56DE;&#x503C;:
        //        true  - &#x8F93;&#x5165;&#x6709;&#x6548;&#xFF0C;&#x5E76;&#x4E14;&#x6570;&#x7EC4;&#x4E2D;&#x5B58;&#x5728;&#x91CD;&#x590D;&#x7684;&#x6570;&#x5B57;
        //        false - &#x8F93;&#x5165;&#x65E0;&#x6548;&#xFF0C;&#x6216;&#x8005;&#x6570;&#x7EC4;&#x4E2D;&#x6CA1;&#x6709;&#x91CD;&#x590D;&#x7684;&#x6570;&#x5B57;
        bool duplicate(int numbers[], int length, int* duplication)
        {
            if(numbers == nullptr || length <= 0 0) return false; for(int i="0;" < length; ++i) { if(numbers[i] || numbers[i]> length - 1)
                    return false;
            }

            for(int i = 0; i < length; ++i)
            {
                while(numbers[i] != i)
                {
                    if(numbers[i] == numbers[numbers[i]])
                    {
                        *duplication = numbers[i];
                        return true;
                    }

                    // &#x4EA4;&#x6362;numbers[i]&#x548C;numbers[numbers[i]]
                    int temp = numbers[i];
                    numbers[i] = numbers[temp];
                    numbers[temp] = temp;
                }
            }

            return false;
        }

        // ====================&#x6D4B;&#x8BD5;&#x4EE3;&#x7801;====================
        bool contains(int array[], int length, int number)
        {
            for(int i = 0; i < length; ++i)
            {
                if(array[i] == number)
                    return true;
            }

            return false;
        }

        void test(char* testName, int numbers[], int lengthNumbers, int expected[], int expectedExpected, bool validArgument)
        {
            printf("%s begins: ", testName);

            int duplication;
            bool validInput = duplicate(numbers, lengthNumbers, &duplication);

            if(validArgument == validInput)
            {
                if(validArgument)
                {
                    if(contains(expected, expectedExpected, duplication))
                        printf("Passed.\n");
                    else
                        printf("FAILED.\n");
                }
                else
                    printf("Passed.\n");
            }
            else
                printf("FAILED.\n");
        }

        // &#x91CD;&#x590D;&#x7684;&#x6570;&#x5B57;&#x662F;&#x6570;&#x7EC4;&#x4E2D;&#x6700;&#x5C0F;&#x7684;&#x6570;&#x5B57;
        void test1()
        {
            int numbers[] = { 2, 1, 3, 1, 4 };
            int duplications[] = { 1 };
            test("Test1", numbers, sizeof(numbers) / sizeof(int), duplications, sizeof(duplications) / sizeof(int), true);
        }

        // &#x91CD;&#x590D;&#x7684;&#x6570;&#x5B57;&#x662F;&#x6570;&#x7EC4;&#x4E2D;&#x6700;&#x5927;&#x7684;&#x6570;&#x5B57;
        void test2()
        {
            int numbers[] = { 2, 4, 3, 1, 4 };
            int duplications[] = { 4 };
            test("Test2", numbers, sizeof(numbers) / sizeof(int), duplications, sizeof(duplications) / sizeof(int), true);
        }

        // &#x6570;&#x7EC4;&#x4E2D;&#x5B58;&#x5728;&#x591A;&#x4E2A;&#x91CD;&#x590D;&#x7684;&#x6570;&#x5B57;
        void test3()
        {
            int numbers[] = { 2, 4, 2, 1, 4 };
            int duplications[] = { 2, 4 };
            test("Test3", numbers, sizeof(numbers) / sizeof(int), duplications, sizeof(duplications) / sizeof(int), true);
        }

        // &#x6CA1;&#x6709;&#x91CD;&#x590D;&#x7684;&#x6570;&#x5B57;
        void test4()
        {
            int numbers[] = { 2, 1, 3, 0, 4 };
            int duplications[] = { -1 }; // not in use in the test function
            test("Test4", numbers, sizeof(numbers) / sizeof(int), duplications, sizeof(duplications) / sizeof(int), false);
        }

        // &#x6CA1;&#x6709;&#x91CD;&#x590D;&#x7684;&#x6570;&#x5B57;
        void test5()
        {
            int numbers[] = { 2, 1, 3, 5, 4 };
            int duplications[] = { -1 }; // not in use in the test function
            test("Test5", numbers, sizeof(numbers) / sizeof(int), duplications, sizeof(duplications) / sizeof(int), false);
        }

        // &#x65E0;&#x6548;&#x7684;&#x8F93;&#x5165;
        void test6()
        {
            int* numbers = nullptr;
            int duplications[] = { -1 }; // not in use in the test function
            test("Test6", numbers, 0, duplications, sizeof(duplications) / sizeof(int), false);
        }

        void main()
        {
            test1();
            test2();
            test3();
            test4();
            test5();
            test6();
            while(1);
        }
</=></cstdio>
    /*******************************************************************
    Copyright(c) 2016, Harry He
    All rights reserved.

    Distributed under the BSD license.
    (See accompanying file LICENSE.txt at
    https://github.com/zhedahht/CodingInterviewChinese2/blob/master/LICENSE.txt)
    *******************************************************************/

    //==================================================================
    // &#x300A;&#x5251;&#x6307;Offer&#x2014;&#x2014;&#x540D;&#x4F01;&#x9762;&#x8BD5;&#x5B98;&#x7CBE;&#x8BB2;&#x5178;&#x578B;&#x7F16;&#x7A0B;&#x9898;&#x300B;&#x4EE3;&#x7801;
    // &#x4F5C;&#x8005;&#xFF1A;&#x4F55;&#x6D77;&#x6D9B;
    //==================================================================

    // &#x9762;&#x8BD5;&#x9898;3&#xFF08;&#x4E8C;&#xFF09;&#xFF1A;&#x4E0D;&#x4FEE;&#x6539;&#x6570;&#x7EC4;&#x627E;&#x51FA;&#x91CD;&#x590D;&#x7684;&#x6570;&#x5B57;
    // &#x9898;&#x76EE;&#xFF1A;&#x5728;&#x4E00;&#x4E2A;&#x957F;&#x5EA6;&#x4E3A;n+1&#x7684;&#x6570;&#x7EC4;&#x91CC;&#x7684;&#x6240;&#x6709;&#x6570;&#x5B57;&#x90FD;&#x5728;1&#x5230;n&#x7684;&#x8303;&#x56F4;&#x5185;&#xFF0C;&#x6240;&#x4EE5;&#x6570;&#x7EC4;&#x4E2D;&#x81F3;
    // &#x5C11;&#x6709;&#x4E00;&#x4E2A;&#x6570;&#x5B57;&#x662F;&#x91CD;&#x590D;&#x7684;&#x3002;&#x8BF7;&#x627E;&#x51FA;&#x6570;&#x7EC4;&#x4E2D;&#x4EFB;&#x610F;&#x4E00;&#x4E2A;&#x91CD;&#x590D;&#x7684;&#x6570;&#x5B57;&#xFF0C;&#x4F46;&#x4E0D;&#x80FD;&#x4FEE;&#x6539;&#x8F93;&#x5165;&#x7684;
    // &#x6570;&#x7EC4;&#x3002;&#x4F8B;&#x5982;&#xFF0C;&#x5982;&#x679C;&#x8F93;&#x5165;&#x957F;&#x5EA6;&#x4E3A;8&#x7684;&#x6570;&#x7EC4;{2, 3, 5, 4, 3, 2, 6, 7}&#xFF0C;&#x90A3;&#x4E48;&#x5BF9;&#x5E94;&#x7684;
    // &#x8F93;&#x51FA;&#x662F;&#x91CD;&#x590D;&#x7684;&#x6570;&#x5B57;2&#x6216;&#x8005;3&#x3002;

    #include <iostream>

    int countRange(const int* numbers, int length, int start, int end);

    // &#x53C2;&#x6570;:
    //        numbers:     &#x4E00;&#x4E2A;&#x6574;&#x6570;&#x6570;&#x7EC4;
    //        length:      &#x6570;&#x7EC4;&#x7684;&#x957F;&#x5EA6;
    // &#x8FD4;&#x56DE;&#x503C;:
    //        &#x6B63;&#x6570;  - &#x8F93;&#x5165;&#x6709;&#x6548;&#xFF0C;&#x5E76;&#x4E14;&#x6570;&#x7EC4;&#x4E2D;&#x5B58;&#x5728;&#x91CD;&#x590D;&#x7684;&#x6570;&#x5B57;&#xFF0C;&#x8FD4;&#x56DE;&#x503C;&#x4E3A;&#x91CD;&#x590D;&#x7684;&#x6570;&#x5B57;
    //        &#x8D1F;&#x6570;  - &#x8F93;&#x5165;&#x65E0;&#x6548;&#xFF0C;&#x6216;&#x8005;&#x6570;&#x7EC4;&#x4E2D;&#x6CA1;&#x6709;&#x91CD;&#x590D;&#x7684;&#x6570;&#x5B57;
    int getDuplication(const int* numbers, int length)
    {
        if(numbers == nullptr || length <= 0) return -1; int start="1;" end="length" - 1; while(end>= start)
        {
            int middle = ((end - start) >> 1) + start;
            int count = countRange(numbers, length, start, middle);
            if(end == start)
            {
                if(count > 1)
                    return start;
                else
                    break;
            }

            if(count > (middle - start + 1))
                end = middle;
            else
                start = middle + 1;
        }
        return -1;
    }

    int countRange(const int* numbers, int length, int start, int end)
    {
        if(numbers == nullptr)
            return 0;

        int count = 0;
        for(int i = 0; i < length; i++)
            if(numbers[i] >= start && numbers[i] <= 1 2 3 4 6 7 8 end) ++count; return count; } =="==================&#x6D4B;&#x8BD5;&#x4EE3;&#x7801;====================" void test(const char* testname, int* numbers, int length, duplications, duplength) { result="getDuplication(numbers," length); for(int i="0;" < duplength; ++i) if(result="=" duplications[i]) std::cout << testname " passed." std::endl; return; failed." 多个重复的数字 test1() numbers[]="{" 2, 3, 5, 4, 6, }; duplications[]="{" test("test1", sizeof(numbers) sizeof(int), sizeof(duplications) sizeof(int)); 一个重复的数字 test2() 1, test("test2", 重复的数字是数组中最小的数字 test3() 7, test("test3", 重复的数字是数组中最大的数字 test4() 8, test("test4", 数组中只有两个数字 test5() test("test5", 重复的数字位于数组当中 test6() test("test6", test7() test("test7", 一个数字重复三次 test8() test("test8", 没有重复的数字 test9() -1 test("test9", 无效的输入 test10() numbers="nullptr;" test("test10", 0, main() test1(); test2(); test3(); test4(); test5(); test6(); test7(); test8(); test9(); test10(); code></=></=></iostream>

4. 【剑指Offer学习】【面试题04:二维数组中的查找

        /*******************************************************************
        Copyright(c) 2016, Harry He
        All rights reserved.

        Distributed under the BSD license.
        (See accompanying file LICENSE.txt at
        https://github.com/zhedahht/CodingInterviewChinese2/blob/master/LICENSE.txt)
        *******************************************************************/

        //==================================================================
        // &#x300A;&#x5251;&#x6307;Offer&#x2014;&#x2014;&#x540D;&#x4F01;&#x9762;&#x8BD5;&#x5B98;&#x7CBE;&#x8BB2;&#x5178;&#x578B;&#x7F16;&#x7A0B;&#x9898;&#x300B;&#x4EE3;&#x7801;
        // &#x4F5C;&#x8005;&#xFF1A;&#x4F55;&#x6D77;&#x6D9B;
        //==================================================================

        // &#x9762;&#x8BD5;&#x9898;4&#xFF1A;&#x4E8C;&#x7EF4;&#x6570;&#x7EC4;&#x4E2D;&#x7684;&#x67E5;&#x627E;
        // &#x9898;&#x76EE;&#xFF1A;&#x5728;&#x4E00;&#x4E2A;&#x4E8C;&#x7EF4;&#x6570;&#x7EC4;&#x4E2D;&#xFF0C;&#x6BCF;&#x4E00;&#x884C;&#x90FD;&#x6309;&#x7167;&#x4ECE;&#x5DE6;&#x5230;&#x53F3;&#x9012;&#x589E;&#x7684;&#x987A;&#x5E8F;&#x6392;&#x5E8F;&#xFF0C;&#x6BCF;&#x4E00;&#x5217;&#x90FD;&#x6309;
        // &#x7167;&#x4ECE;&#x4E0A;&#x5230;&#x4E0B;&#x9012;&#x589E;&#x7684;&#x987A;&#x5E8F;&#x6392;&#x5E8F;&#x3002;&#x8BF7;&#x5B8C;&#x6210;&#x4E00;&#x4E2A;&#x51FD;&#x6570;&#xFF0C;&#x8F93;&#x5165;&#x8FD9;&#x6837;&#x7684;&#x4E00;&#x4E2A;&#x4E8C;&#x7EF4;&#x6570;&#x7EC4;&#x548C;&#x4E00;&#x4E2A;
        // &#x6574;&#x6570;&#xFF0C;&#x5224;&#x65AD;&#x6570;&#x7EC4;&#x4E2D;&#x662F;&#x5426;&#x542B;&#x6709;&#x8BE5;&#x6574;&#x6570;&#x3002;

        #include <cstdio>

        bool Find(int* matrix, int rows, int columns, int number)
        {
            bool found = false;

            if(matrix != nullptr && rows > 0 && columns > 0)
            {
                int row = 0;
                int column = columns - 1;
                while(row < rows && column >=0)
                {
                    if(matrix[row * columns + column] == number)
                    {
                        found = true;
                        break;
                    }
                    else if(matrix[row * columns + column] > number)
                        -- column;
                    else
                        ++ row;
                }
            }

            return found;
        }

        // ====================&#x6D4B;&#x8BD5;&#x4EE3;&#x7801;====================
        void Test(char* testName, int* matrix, int rows, int columns, int number, bool expected)
        {
            if(testName != nullptr)
                printf("%s begins: ", testName);

            bool result = Find(matrix, rows, columns, number);
            if(result == expected)
                printf("Passed.\n");
            else
                printf("Failed.\n");
        }

        //  1   2   8   9
        //  2   4   9   12
        //  4   7   10  13
        //  6   8   11  15
        // &#x8981;&#x67E5;&#x627E;&#x7684;&#x6570;&#x5728;&#x6570;&#x7EC4;&#x4E2D;
        void Test1()
        {
            int matrix[][4] = {{1, 2, 8, 9}, {2, 4, 9, 12}, {4, 7, 10, 13}, {6, 8, 11, 15}};
            Test("Test1", (int*)matrix, 4, 4, 7, true);
        }

        //  1   2   8   9
        //  2   4   9   12
        //  4   7   10  13
        //  6   8   11  15
        // &#x8981;&#x67E5;&#x627E;&#x7684;&#x6570;&#x4E0D;&#x5728;&#x6570;&#x7EC4;&#x4E2D;
        void Test2()
        {
            int matrix[][4] = {{1, 2, 8, 9}, {2, 4, 9, 12}, {4, 7, 10, 13}, {6, 8, 11, 15}};
            Test("Test2", (int*)matrix, 4, 4, 5, false);
        }

        //  1   2   8   9
        //  2   4   9   12
        //  4   7   10  13
        //  6   8   11  15
        // &#x8981;&#x67E5;&#x627E;&#x7684;&#x6570;&#x662F;&#x6570;&#x7EC4;&#x4E2D;&#x6700;&#x5C0F;&#x7684;&#x6570;&#x5B57;
        void Test3()
        {
            int matrix[][4] = {{1, 2, 8, 9}, {2, 4, 9, 12}, {4, 7, 10, 13}, {6, 8, 11, 15}};
            Test("Test3", (int*)matrix, 4, 4, 1, true);
        }

        //  1   2   8   9
        //  2   4   9   12
        //  4   7   10  13
        //  6   8   11  15
        // &#x8981;&#x67E5;&#x627E;&#x7684;&#x6570;&#x662F;&#x6570;&#x7EC4;&#x4E2D;&#x6700;&#x5927;&#x7684;&#x6570;&#x5B57;
        void Test4()
        {
            int matrix[][4] = {{1, 2, 8, 9}, {2, 4, 9, 12}, {4, 7, 10, 13}, {6, 8, 11, 15}};
            Test("Test4", (int*)matrix, 4, 4, 15, true);
        }

        //  1   2   8   9
        //  2   4   9   12
        //  4   7   10  13
        //  6   8   11  15
        // &#x8981;&#x67E5;&#x627E;&#x7684;&#x6570;&#x6BD4;&#x6570;&#x7EC4;&#x4E2D;&#x6700;&#x5C0F;&#x7684;&#x6570;&#x5B57;&#x8FD8;&#x5C0F;
        void Test5()
        {
            int matrix[][4] = {{1, 2, 8, 9}, {2, 4, 9, 12}, {4, 7, 10, 13}, {6, 8, 11, 15}};
            Test("Test5", (int*)matrix, 4, 4, 0, false);
        }

        //  1   2   8   9
        //  2   4   9   12
        //  4   7   10  13
        //  6   8   11  15
        // &#x8981;&#x67E5;&#x627E;&#x7684;&#x6570;&#x6BD4;&#x6570;&#x7EC4;&#x4E2D;&#x6700;&#x5927;&#x7684;&#x6570;&#x5B57;&#x8FD8;&#x5927;
        void Test6()
        {
            int matrix[][4] = {{1, 2, 8, 9}, {2, 4, 9, 12}, {4, 7, 10, 13}, {6, 8, 11, 15}};
            Test("Test6", (int*)matrix, 4, 4, 16, false);
        }

        // &#x9C81;&#x68D2;&#x6027;&#x6D4B;&#x8BD5;&#xFF0C;&#x8F93;&#x5165;&#x7A7A;&#x6307;&#x9488;
        void Test7()
        {
            Test("Test7", nullptr, 0, 0, 16, false);
        }

        int main(int argc, char* argv[])
        {
            Test1();
            Test2();
            Test3();
            Test4();
            Test5();
            Test6();
            Test7();

            return 0;
        }
</cstdio>

11. 面试题11:旋转数组的最小数字

/************* Copyright(c) 2016, Harry He All rights reserved.

        Distributed under the BSD license.
        (See accompanying file LICENSE.txt at
        https://github.com/zhedahht/CodingInterviewChinese2/blob/master/LICENSE.txt)
        *******************************************************************/

        //==================================================================
        // &#x300A;&#x5251;&#x6307;Offer&#x2014;&#x2014;&#x540D;&#x4F01;&#x9762;&#x8BD5;&#x5B98;&#x7CBE;&#x8BB2;&#x5178;&#x578B;&#x7F16;&#x7A0B;&#x9898;&#x300B;&#x4EE3;&#x7801;
        // &#x4F5C;&#x8005;&#xFF1A;&#x4F55;&#x6D77;&#x6D9B;
        //==================================================================

        // &#x9762;&#x8BD5;&#x9898;11&#xFF1A;&#x65CB;&#x8F6C;&#x6570;&#x7EC4;&#x7684;&#x6700;&#x5C0F;&#x6570;&#x5B57;
        // &#x9898;&#x76EE;&#xFF1A;&#x628A;&#x4E00;&#x4E2A;&#x6570;&#x7EC4;&#x6700;&#x5F00;&#x59CB;&#x7684;&#x82E5;&#x5E72;&#x4E2A;&#x5143;&#x7D20;&#x642C;&#x5230;&#x6570;&#x7EC4;&#x7684;&#x672B;&#x5C3E;&#xFF0C;&#x6211;&#x4EEC;&#x79F0;&#x4E4B;&#x4E3A;&#x6570;&#x7EC4;&#x7684;&#x65CB;&#x8F6C;&#x3002;
        // &#x8F93;&#x5165;&#x4E00;&#x4E2A;&#x9012;&#x589E;&#x6392;&#x5E8F;&#x7684;&#x6570;&#x7EC4;&#x7684;&#x4E00;&#x4E2A;&#x65CB;&#x8F6C;&#xFF0C;&#x8F93;&#x51FA;&#x65CB;&#x8F6C;&#x6570;&#x7EC4;&#x7684;&#x6700;&#x5C0F;&#x5143;&#x7D20;&#x3002;&#x4F8B;&#x5982;&#x6570;&#x7EC4;
        // {3, 4, 5, 1, 2}&#x4E3A;{1, 2, 3, 4, 5}&#x7684;&#x4E00;&#x4E2A;&#x65CB;&#x8F6C;&#xFF0C;&#x8BE5;&#x6570;&#x7EC4;&#x7684;&#x6700;&#x5C0F;&#x503C;&#x4E3A;1&#x3002;

        #include <cstdio>
        #include <exception>

        int MinInOrder(int* numbers, int index1, int index2);

        int Min(int* numbers, int length)
        {
            if(numbers == nullptr || length <= 0) throw new std::exception("invalid parameters"); int index1="0;" index2="length" - 1; indexmid="index1;" while(numbers[index1]>= numbers[index2])
            {
                // &#x5982;&#x679C;index1&#x548C;index2&#x6307;&#x5411;&#x76F8;&#x90BB;&#x7684;&#x4E24;&#x4E2A;&#x6570;&#xFF0C;
                // &#x5219;index1&#x6307;&#x5411;&#x7B2C;&#x4E00;&#x4E2A;&#x9012;&#x589E;&#x5B50;&#x6570;&#x7EC4;&#x7684;&#x6700;&#x540E;&#x4E00;&#x4E2A;&#x6570;&#x5B57;&#xFF0C;
                // index2&#x6307;&#x5411;&#x7B2C;&#x4E8C;&#x4E2A;&#x5B50;&#x6570;&#x7EC4;&#x7684;&#x7B2C;&#x4E00;&#x4E2A;&#x6570;&#x5B57;&#xFF0C;&#x4E5F;&#x5C31;&#x662F;&#x6570;&#x7EC4;&#x4E2D;&#x7684;&#x6700;&#x5C0F;&#x6570;&#x5B57;
                if(index2 - index1 == 1)
                {
                    indexMid = index2;
                    break;
                }

                // &#x5982;&#x679C;&#x4E0B;&#x6807;&#x4E3A;index1&#x3001;index2&#x548C;indexMid&#x6307;&#x5411;&#x7684;&#x4E09;&#x4E2A;&#x6570;&#x5B57;&#x76F8;&#x7B49;&#xFF0C;
                // &#x5219;&#x53EA;&#x80FD;&#x987A;&#x5E8F;&#x67E5;&#x627E;
                indexMid = (index1 + index2) / 2;
                if(numbers[index1] == numbers[index2] && numbers[indexMid] == numbers[index1])
                    return MinInOrder(numbers, index1, index2);

                // &#x7F29;&#x5C0F;&#x67E5;&#x627E;&#x8303;&#x56F4;
                if(numbers[indexMid] >= numbers[index1])
                    index1 = indexMid;
                else if(numbers[indexMid] <= numbers[index2]) index2="indexMid;" } return numbers[indexmid]; int mininorder(int* numbers, index1, index2) { result="numbers[index1];" for(int i="index1" + 1; <="index2;" ++i) if(result> numbers[i])
                    result = numbers[i];
            }

            return result;
        }

        // ====================&#x6D4B;&#x8BD5;&#x4EE3;&#x7801;====================
        void Test(int* numbers, int length, int expected)
        {
            int result = 0;
            try
            {
                result = Min(numbers, length);

                for(int i = 0; i < length; ++i)
                    printf("%d ", numbers[i]);

                if(result == expected)
                    printf("\tpassed\n");
                else
                    printf("\tfailed\n");
            }
            catch (...)
            {
                if(numbers == nullptr)
                    printf("Test passed.\n");
                else
                    printf("Test failed.\n");
            }
        }

        int main(int argc, char* argv[])
        {
            // &#x5178;&#x578B;&#x8F93;&#x5165;&#xFF0C;&#x5355;&#x8C03;&#x5347;&#x5E8F;&#x7684;&#x6570;&#x7EC4;&#x7684;&#x4E00;&#x4E2A;&#x65CB;&#x8F6C;
            int array1[] = { 3, 4, 5, 1, 2 };
            Test(array1, sizeof(array1) / sizeof(int), 1);

            // &#x6709;&#x91CD;&#x590D;&#x6570;&#x5B57;&#xFF0C;&#x5E76;&#x4E14;&#x91CD;&#x590D;&#x7684;&#x6570;&#x5B57;&#x521A;&#x597D;&#x7684;&#x6700;&#x5C0F;&#x7684;&#x6570;&#x5B57;
            int array2[] = { 3, 4, 5, 1, 1, 2 };
            Test(array2, sizeof(array2) / sizeof(int), 1);

            // &#x6709;&#x91CD;&#x590D;&#x6570;&#x5B57;&#xFF0C;&#x4F46;&#x91CD;&#x590D;&#x7684;&#x6570;&#x5B57;&#x4E0D;&#x662F;&#x7B2C;&#x4E00;&#x4E2A;&#x6570;&#x5B57;&#x548C;&#x6700;&#x540E;&#x4E00;&#x4E2A;&#x6570;&#x5B57;
            int array3[] = { 3, 4, 5, 1, 2, 2 };
            Test(array3, sizeof(array3) / sizeof(int), 1);

            // &#x6709;&#x91CD;&#x590D;&#x7684;&#x6570;&#x5B57;&#xFF0C;&#x5E76;&#x4E14;&#x91CD;&#x590D;&#x7684;&#x6570;&#x5B57;&#x521A;&#x597D;&#x662F;&#x7B2C;&#x4E00;&#x4E2A;&#x6570;&#x5B57;&#x548C;&#x6700;&#x540E;&#x4E00;&#x4E2A;&#x6570;&#x5B57;
            int array4[] = { 1, 0, 1, 1, 1 };
            Test(array4, sizeof(array4) / sizeof(int), 0);

            // &#x5355;&#x8C03;&#x5347;&#x5E8F;&#x6570;&#x7EC4;&#xFF0C;&#x65CB;&#x8F6C;0&#x4E2A;&#x5143;&#x7D20;&#xFF0C;&#x4E5F;&#x5C31;&#x662F;&#x5355;&#x8C03;&#x5347;&#x5E8F;&#x6570;&#x7EC4;&#x672C;&#x8EAB;
            int array5[] = { 1, 2, 3, 4, 5 };
            Test(array5, sizeof(array5) / sizeof(int), 1);

            // &#x6570;&#x7EC4;&#x4E2D;&#x53EA;&#x6709;&#x4E00;&#x4E2A;&#x6570;&#x5B57;
            int array6[] = { 2 };
            Test(array6, sizeof(array6) / sizeof(int), 2);

            // &#x8F93;&#x5165;nullptr
            Test(nullptr, 0, 0);

            return 0;
        }
</=></=></exception></cstdio>

16. 面试题16:数值的整数次方

    /*******************************************************************
    Copyright(c) 2016, Harry He
    All rights reserved.

    Distributed under the BSD license.
    (See accompanying file LICENSE.txt at
    https://github.com/zhedahht/CodingInterviewChinese2/blob/master/LICENSE.txt)
    *******************************************************************/

    //==================================================================
    // &#x300A;&#x5251;&#x6307;Offer&#x2014;&#x2014;&#x540D;&#x4F01;&#x9762;&#x8BD5;&#x5B98;&#x7CBE;&#x8BB2;&#x5178;&#x578B;&#x7F16;&#x7A0B;&#x9898;&#x300B;&#x4EE3;&#x7801;
    // &#x4F5C;&#x8005;&#xFF1A;&#x4F55;&#x6D77;&#x6D9B;
    //==================================================================

    // &#x9762;&#x8BD5;&#x9898;16&#xFF1A;&#x6570;&#x503C;&#x7684;&#x6574;&#x6570;&#x6B21;&#x65B9;
    // &#x9898;&#x76EE;&#xFF1A;&#x5B9E;&#x73B0;&#x51FD;&#x6570;double Power(double base, int exponent)&#xFF0C;&#x6C42;base&#x7684;exponent
    // &#x6B21;&#x65B9;&#x3002;&#x4E0D;&#x5F97;&#x4F7F;&#x7528;&#x5E93;&#x51FD;&#x6570;&#xFF0C;&#x540C;&#x65F6;&#x4E0D;&#x9700;&#x8981;&#x8003;&#x8651;&#x5927;&#x6570;&#x95EE;&#x9898;&#x3002;

    #include <iostream>
    #include <cmath>

    bool g_InvalidInput = false;
    bool equal(double num1, double num2);
    double PowerWithUnsignedExponent(double base, unsigned int exponent);

    double Power(double base, int exponent)
    {
        g_InvalidInput = false;

        if (equal(base, 0.0) && exponent < 0)
        {
            g_InvalidInput = true;
            return 0.0;
        }

        unsigned int absExponent = (unsigned int) (exponent);
        if (exponent < 0)
            absExponent = (unsigned int) (-exponent);

        double result = PowerWithUnsignedExponent(base, absExponent);
        if (exponent < 0)
            result = 1.0 / result;

        return result;
    }

    /*
    double PowerWithUnsignedExponent(double base, unsigned int exponent)
    {
        double result = 1.0;

        for (int i = 1; i <= exponent; ++i) result *="base;" return result; } double powerwithunsignedexponent(double base, unsigned int exponent) { if (exponent="=" 0) 1; 1) base; exponent>> 1);
        result *= result;
        if ((exponent & 0x1) == 1)
            result *= base;

        return result;
    }

    bool equal(double num1, double num2)
    {
        if ((num1 - num2 > -0.0000001) && (num1 - num2 < 0.0000001))
            return true;
        else
            return false;
    }

    // ====================&#x6D4B;&#x8BD5;&#x4EE3;&#x7801;====================
    void Test(const char* testName, double base, int exponent, double expectedResult, bool expectedFlag)
    {
        double result = Power(base, exponent);
        if (equal(result, expectedResult) && g_InvalidInput == expectedFlag)
            std::cout << testName << " passed" << std::endl;
        else
            std::cout << testName << " FAILED" << std::endl;
    }

    int main(int argc, char* argv[])
    {
        // &#x5E95;&#x6570;&#x3001;&#x6307;&#x6570;&#x90FD;&#x4E3A;&#x6B63;&#x6570;
        Test("Test1", 2, 3, 8, false);

        // &#x5E95;&#x6570;&#x4E3A;&#x8D1F;&#x6570;&#x3001;&#x6307;&#x6570;&#x4E3A;&#x6B63;&#x6570;
        Test("Test2", -2, 3, -8, false);

        // &#x6307;&#x6570;&#x4E3A;&#x8D1F;&#x6570;
        Test("Test3", 2, -3, 0.125, false);

        // &#x6307;&#x6570;&#x4E3A;0
        Test("Test4", 2, 0, 1, false);

        // &#x5E95;&#x6570;&#x3001;&#x6307;&#x6570;&#x90FD;&#x4E3A;0
        Test("Test5", 0, 0, 1, false);

        // &#x5E95;&#x6570;&#x4E3A;0&#x3001;&#x6307;&#x6570;&#x4E3A;&#x6B63;&#x6570;
        Test("Test6", 0, 4, 0, false);

        // &#x5E95;&#x6570;&#x4E3A;0&#x3001;&#x6307;&#x6570;&#x4E3A;&#x8D1F;&#x6570;
        Test("Test7", 0, -4, 0, true);

        return 0;
    }
</=></cmath></iostream>

21. 面试题21:调整数组顺序使奇数位于偶数前面

        /*******************************************************************
        Copyright(c) 2016, Harry He
        All rights reserved.

        Distributed under the BSD license.
        (See accompanying file LICENSE.txt at
        https://github.com/zhedahht/CodingInterviewChinese2/blob/master/LICENSE.txt)
        *******************************************************************/

        //==================================================================
        // &#x300A;&#x5251;&#x6307;Offer&#x2014;&#x2014;&#x540D;&#x4F01;&#x9762;&#x8BD5;&#x5B98;&#x7CBE;&#x8BB2;&#x5178;&#x578B;&#x7F16;&#x7A0B;&#x9898;&#x300B;&#x4EE3;&#x7801;
        // &#x4F5C;&#x8005;&#xFF1A;&#x4F55;&#x6D77;&#x6D9B;
        //==================================================================

        // &#x9762;&#x8BD5;&#x9898;21&#xFF1A;&#x8C03;&#x6574;&#x6570;&#x7EC4;&#x987A;&#x5E8F;&#x4F7F;&#x5947;&#x6570;&#x4F4D;&#x4E8E;&#x5076;&#x6570;&#x524D;&#x9762;
        // &#x9898;&#x76EE;&#xFF1A;&#x8F93;&#x5165;&#x4E00;&#x4E2A;&#x6574;&#x6570;&#x6570;&#x7EC4;&#xFF0C;&#x5B9E;&#x73B0;&#x4E00;&#x4E2A;&#x51FD;&#x6570;&#x6765;&#x8C03;&#x6574;&#x8BE5;&#x6570;&#x7EC4;&#x4E2D;&#x6570;&#x5B57;&#x7684;&#x987A;&#x5E8F;&#xFF0C;&#x4F7F;&#x5F97;&#x6240;&#x6709;
        // &#x5947;&#x6570;&#x4F4D;&#x4E8E;&#x6570;&#x7EC4;&#x7684;&#x524D;&#x534A;&#x90E8;&#x5206;&#xFF0C;&#x6240;&#x6709;&#x5076;&#x6570;&#x4F4D;&#x4E8E;&#x6570;&#x7EC4;&#x7684;&#x540E;&#x534A;&#x90E8;&#x5206;&#x3002;

        #include <cstdio>

        void Reorder(int *pData, unsigned int length, bool (*func)(int));
        bool isEven(int n);

        // ====================&#x65B9;&#x6CD5;&#x4E00;====================
        void ReorderOddEven_1(int *pData, unsigned int length)
        {
            if(pData == nullptr || length == 0)
                return;

            int *pBegin = pData;
            int *pEnd = pData + length - 1;

            while(pBegin < pEnd)
            {
                // &#x5411;&#x540E;&#x79FB;&#x52A8;pBegin&#xFF0C;&#x76F4;&#x5230;&#x5B83;&#x6307;&#x5411;&#x5076;&#x6570;
                while(pBegin < pEnd && (*pBegin & 0x1) != 0)
                    pBegin ++;

                // &#x5411;&#x524D;&#x79FB;&#x52A8;pEnd&#xFF0C;&#x76F4;&#x5230;&#x5B83;&#x6307;&#x5411;&#x5947;&#x6570;
                while(pBegin < pEnd && (*pEnd & 0x1) == 0)
                    pEnd --;

                if(pBegin < pEnd)
                {
                    int temp = *pBegin;
                    *pBegin = *pEnd;
                    *pEnd = temp;
                }
            }
        }

        // ====================&#x65B9;&#x6CD5;&#x4E8C;====================
        void ReorderOddEven_2(int *pData, unsigned int length)
        {
            Reorder(pData, length, isEven);
        }

        void Reorder(int *pData, unsigned int length, bool (*func)(int))
        {
            if(pData == nullptr || length == 0)
                return;

            int *pBegin = pData;
            int *pEnd = pData + length - 1;

            while(pBegin < pEnd)
            {
                // &#x5411;&#x540E;&#x79FB;&#x52A8;pBegin
                while(pBegin < pEnd && !func(*pBegin))
                    pBegin ++;

                // &#x5411;&#x524D;&#x79FB;&#x52A8;pEnd
                while(pBegin < pEnd && func(*pEnd))
                    pEnd --;

                if(pBegin < pEnd)
                {
                    int temp = *pBegin;
                    *pBegin = *pEnd;
                    *pEnd = temp;
                }
            }
        }

        bool isEven(int n)
        {
            return (n & 1) == 0;
        }

        // ====================&#x6D4B;&#x8BD5;&#x4EE3;&#x7801;====================
        void PrintArray(int numbers[], int length)
        {
            if(length < 0)
                return;

            for(int i = 0; i < length; ++i)
                printf("%d\t", numbers[i]);

            printf("\n");
        }

        void Test(char* testName, int numbers[], int length)
        {
            if(testName != nullptr)
                printf("%s begins:\n", testName);

            int* copy = new int[length];
            for(int i = 0; i < length; ++i)
            {
                copy[i] = numbers[i];
            }

            printf("Test for solution 1:\n");
            PrintArray(numbers, length);
            ReorderOddEven_1(numbers, length);
            PrintArray(numbers, length);

            printf("Test for solution 2:\n");
            PrintArray(copy, length);
            ReorderOddEven_2(copy, length);
            PrintArray(copy, length);

            delete[] copy;
        }

        void Test1()
        {
            int numbers[] = {1, 2, 3, 4, 5, 6, 7};
            Test("Test1", numbers, sizeof(numbers)/sizeof(int));
        }

        void Test2()
        {
            int numbers[] = {2, 4, 6, 1, 3, 5, 7};
            Test("Test2", numbers, sizeof(numbers)/sizeof(int));
        }

        void Test3()
        {
            int numbers[] = {1, 3, 5, 7, 2, 4, 6};
            Test("Test3", numbers, sizeof(numbers)/sizeof(int));
        }

        void Test4()
        {
            int numbers[] = {1};
            Test("Test4", numbers, sizeof(numbers)/sizeof(int));
        }

        void Test5()
        {
            int numbers[] = {2};
            Test("Test5", numbers, sizeof(numbers)/sizeof(int));
        }

        void Test6()
        {
            Test("Test6", nullptr, 0);
        }

        int main(int argc, char* argv[])
        {
            Test1();
            Test2();
            Test3();
            Test4();
            Test5();
            Test6();

            return 0;
        }
</cstdio>

39. 面试题39:数组中出现次数超过一半的数字

            /*******************************************************************
            Copyright(c) 2016, Harry He
            All rights reserved.

            Distributed under the BSD license.
            (See accompanying file LICENSE.txt at
            https://github.com/zhedahht/CodingInterviewChinese2/blob/master/LICENSE.txt)
            *******************************************************************/

            //==================================================================
            // &#x300A;&#x5251;&#x6307;Offer&#x2014;&#x2014;&#x540D;&#x4F01;&#x9762;&#x8BD5;&#x5B98;&#x7CBE;&#x8BB2;&#x5178;&#x578B;&#x7F16;&#x7A0B;&#x9898;&#x300B;&#x4EE3;&#x7801;
            // &#x4F5C;&#x8005;&#xFF1A;&#x4F55;&#x6D77;&#x6D9B;
            //==================================================================

            // &#x9762;&#x8BD5;&#x9898;39&#xFF1A;&#x6570;&#x7EC4;&#x4E2D;&#x51FA;&#x73B0;&#x6B21;&#x6570;&#x8D85;&#x8FC7;&#x4E00;&#x534A;&#x7684;&#x6570;&#x5B57;
            // &#x9898;&#x76EE;&#xFF1A;&#x6570;&#x7EC4;&#x4E2D;&#x6709;&#x4E00;&#x4E2A;&#x6570;&#x5B57;&#x51FA;&#x73B0;&#x7684;&#x6B21;&#x6570;&#x8D85;&#x8FC7;&#x6570;&#x7EC4;&#x957F;&#x5EA6;&#x7684;&#x4E00;&#x534A;&#xFF0C;&#x8BF7;&#x627E;&#x51FA;&#x8FD9;&#x4E2A;&#x6570;&#x5B57;&#x3002;&#x4F8B;
            // &#x5982;&#x8F93;&#x5165;&#x4E00;&#x4E2A;&#x957F;&#x5EA6;&#x4E3A;9&#x7684;&#x6570;&#x7EC4;{1, 2, 3, 2, 2, 2, 5, 4, 2}&#x3002;&#x7531;&#x4E8E;&#x6570;&#x5B57;2&#x5728;&#x6570;&#x7EC4;&#x4E2D;
            // &#x51FA;&#x73B0;&#x4E86;5&#x6B21;&#xFF0C;&#x8D85;&#x8FC7;&#x6570;&#x7EC4;&#x957F;&#x5EA6;&#x7684;&#x4E00;&#x534A;&#xFF0C;&#x56E0;&#x6B64;&#x8F93;&#x51FA;2&#x3002;

            #include <cstdio>
            #include "..\Utilities\Array.h"

            bool g_bInputInvalid = false;

            bool CheckInvalidArray(int* numbers, int length)
            {
                g_bInputInvalid = false;
                if(numbers == nullptr && length <= 2 0) g_binputinvalid="true;" return g_binputinvalid; } bool checkmorethanhalf(int* numbers, int length, number) { times="0;" for(int i="0;" < length; ++i) if(numbers[i]="=" times++; ismorethanhalf="true;" if(times * ismorethanhalf; =="==================&#x65B9;&#x6CD5;1====================" morethanhalfnum_solution1(int* length) if(checkinvalidarray(numbers, length)) 0; middle="length">> 1;
                int start = 0;
                int end = length - 1;
                int index = Partition(numbers, length, start, end);
                while(index != middle)
                {
                    if(index > middle)
                    {
                        end = index - 1;
                        index = Partition(numbers, length, start, end);
                    }
                    else
                    {
                        start = index + 1;
                        index = Partition(numbers, length, start, end);
                    }
                }

                int result = numbers[middle];
                if(!CheckMoreThanHalf(numbers, length, result))
                    result = 0;

                return result;
            }

            // ====================&#x65B9;&#x6CD5;2====================
            int MoreThanHalfNum_Solution2(int* numbers, int length)
            {
                if(CheckInvalidArray(numbers, length))
                    return 0;

                int result = numbers[0];
                int times = 1;
                for(int i = 1; i < length; ++i)
                {
                    if(times == 0)
                    {
                        result = numbers[i];
                        times = 1;
                    }
                    else if(numbers[i] == result)
                        times++;
                    else
                        times--;
                }

                if(!CheckMoreThanHalf(numbers, length, result))
                    result = 0;

                return result;
            }

            // ====================&#x6D4B;&#x8BD5;&#x4EE3;&#x7801;====================
            void Test(char* testName, int* numbers, int length, int expectedValue, bool expectedFlag)
            {
                if(testName != nullptr)
                    printf("%s begins: \n", testName);

                int* copy = new int[length];
                for(int i = 0; i < length; ++i)
                    copy[i] = numbers[i];

                printf("Test for solution1: ");
                int result = MoreThanHalfNum_Solution1(numbers, length);
                if(result == expectedValue && g_bInputInvalid == expectedFlag)
                    printf("Passed.\n");
                else
                    printf("Failed.\n");

                printf("Test for solution2: ");
                result = MoreThanHalfNum_Solution2(copy, length);
                if(result == expectedValue && g_bInputInvalid == expectedFlag)
                    printf("Passed.\n");
                else
                    printf("Failed.\n");

                delete[] copy;
            }

            // &#x5B58;&#x5728;&#x51FA;&#x73B0;&#x6B21;&#x6570;&#x8D85;&#x8FC7;&#x6570;&#x7EC4;&#x957F;&#x5EA6;&#x4E00;&#x534A;&#x7684;&#x6570;&#x5B57;
            void Test1()
            {
                int numbers[] = {1, 2, 3, 2, 2, 2, 5, 4, 2};
                Test("Test1", numbers, sizeof(numbers) / sizeof(int), 2, false);
            }

            // &#x4E0D;&#x5B58;&#x5728;&#x51FA;&#x73B0;&#x6B21;&#x6570;&#x8D85;&#x8FC7;&#x6570;&#x7EC4;&#x957F;&#x5EA6;&#x4E00;&#x534A;&#x7684;&#x6570;&#x5B57;
            void Test2()
            {
                int numbers[] = {1, 2, 3, 2, 4, 2, 5, 2, 3};
                Test("Test2", numbers, sizeof(numbers) / sizeof(int), 0, true);
            }

            // &#x51FA;&#x73B0;&#x6B21;&#x6570;&#x8D85;&#x8FC7;&#x6570;&#x7EC4;&#x957F;&#x5EA6;&#x4E00;&#x534A;&#x7684;&#x6570;&#x5B57;&#x90FD;&#x51FA;&#x73B0;&#x5728;&#x6570;&#x7EC4;&#x7684;&#x524D;&#x534A;&#x90E8;&#x5206;
            void Test3()
            {
                int numbers[] = {2, 2, 2, 2, 2, 1, 3, 4, 5};
                Test("Test3", numbers, sizeof(numbers) / sizeof(int), 2, false);
            }

            // &#x51FA;&#x73B0;&#x6B21;&#x6570;&#x8D85;&#x8FC7;&#x6570;&#x7EC4;&#x957F;&#x5EA6;&#x4E00;&#x534A;&#x7684;&#x6570;&#x5B57;&#x90FD;&#x51FA;&#x73B0;&#x5728;&#x6570;&#x7EC4;&#x7684;&#x540E;&#x534A;&#x90E8;&#x5206;
            void Test4()
            {
                int numbers[] = {1, 3, 4, 5, 2, 2, 2, 2, 2};
                Test("Test4", numbers, sizeof(numbers) / sizeof(int), 2, false);
            }

            // &#x8F93;&#x5165;&#x7A7A;&#x6307;&#x9488;
            void Test5()
            {
               int numbers[] = {1};
               Test("Test5", numbers, 1, 1, false);
            }

            // &#x8F93;&#x5165;&#x7A7A;&#x6307;&#x9488;
            void Test6()
            {
                Test("Test6", nullptr, 0, 0, true);
            }

            int main(int argc, char* argv[])
            {
                Test1();
                Test2();
                Test3();
                Test4();
                Test5();
                Test6();

                return 0;
            }
</=></cstdio>

42. 面试题42:连续子数组的最大和

        /*******************************************************************
        Copyright(c) 2016, Harry He
        All rights reserved.

        Distributed under the BSD license.
        (See accompanying file LICENSE.txt at
        https://github.com/zhedahht/CodingInterviewChinese2/blob/master/LICENSE.txt)
        *******************************************************************/

        //==================================================================
        // &#x300A;&#x5251;&#x6307;Offer&#x2014;&#x2014;&#x540D;&#x4F01;&#x9762;&#x8BD5;&#x5B98;&#x7CBE;&#x8BB2;&#x5178;&#x578B;&#x7F16;&#x7A0B;&#x9898;&#x300B;&#x4EE3;&#x7801;
        // &#x4F5C;&#x8005;&#xFF1A;&#x4F55;&#x6D77;&#x6D9B;
        //==================================================================

        // &#x9762;&#x8BD5;&#x9898;42&#xFF1A;&#x8FDE;&#x7EED;&#x5B50;&#x6570;&#x7EC4;&#x7684;&#x6700;&#x5927;&#x548C;
        // &#x9898;&#x76EE;&#xFF1A;&#x8F93;&#x5165;&#x4E00;&#x4E2A;&#x6574;&#x578B;&#x6570;&#x7EC4;&#xFF0C;&#x6570;&#x7EC4;&#x91CC;&#x6709;&#x6B63;&#x6570;&#x4E5F;&#x6709;&#x8D1F;&#x6570;&#x3002;&#x6570;&#x7EC4;&#x4E2D;&#x4E00;&#x4E2A;&#x6216;&#x8FDE;&#x7EED;&#x7684;&#x591A;&#x4E2A;&#x6574;
        // &#x6570;&#x7EC4;&#x6210;&#x4E00;&#x4E2A;&#x5B50;&#x6570;&#x7EC4;&#x3002;&#x6C42;&#x6240;&#x6709;&#x5B50;&#x6570;&#x7EC4;&#x7684;&#x548C;&#x7684;&#x6700;&#x5927;&#x503C;&#x3002;&#x8981;&#x6C42;&#x65F6;&#x95F4;&#x590D;&#x6742;&#x5EA6;&#x4E3A;O(n)&#x3002;

        #include <cstdio>

        bool g_InvalidInput = false;

        int FindGreatestSumOfSubArray(int *pData, int nLength)
        {
            if((pData == nullptr) || (nLength <= 0)) { g_invalidinput="true;" return 0; } int ncursum="0;" ngreatestsum="0x80000000;" for(int i="0;" < nlength; ++i) if(ncursum else +="pData[i];"> nGreatestSum)
                    nGreatestSum = nCurSum;
            }

            return nGreatestSum;
        }

        // ====================&#x6D4B;&#x8BD5;&#x4EE3;&#x7801;====================
        void Test(char* testName, int* pData, int nLength, int expected, bool expectedFlag)
        {
            if(testName != nullptr)
                printf("%s begins: \n", testName);

            int result = FindGreatestSumOfSubArray(pData, nLength);
            if(result == expected && expectedFlag == g_InvalidInput)
                printf("Passed.\n");
            else
                printf("Failed.\n");
        }

        // 1, -2, 3, 10, -4, 7, 2, -5
        void Test1()
        {
            int data[] = {1, -2, 3, 10, -4, 7, 2, -5};
            Test("Test1", data, sizeof(data) / sizeof(int), 18, false);
        }

        // &#x6240;&#x6709;&#x6570;&#x5B57;&#x90FD;&#x662F;&#x8D1F;&#x6570;
        // -2, -8, -1, -5, -9
        void Test2()
        {
            int data[] = {-2, -8, -1, -5, -9};
            Test("Test2", data, sizeof(data) / sizeof(int), -1, false);
        }

        // &#x6240;&#x6709;&#x6570;&#x5B57;&#x90FD;&#x662F;&#x6B63;&#x6570;
        // 2, 8, 1, 5, 9
        void Test3()
        {
            int data[] = {2, 8, 1, 5, 9};
            Test("Test3", data, sizeof(data) / sizeof(int), 25, false);
        }

        // &#x65E0;&#x6548;&#x8F93;&#x5165;
        void Test4()
        {
            Test("Test4", nullptr, 0, 0, true);
        }

        int main(int argc, char* argv[])
        {
            Test1();
            Test2();
            Test3();
            Test4();

            return 0;
        }
</=></cstdio>

43. 面试题43:从1到n整数中1出现的次数

        /*******************************************************************
        Copyright(c) 2016, Harry He
        All rights reserved.

        Distributed under the BSD license.
        (See accompanying file LICENSE.txt at
        https://github.com/zhedahht/CodingInterviewChinese2/blob/master/LICENSE.txt)
        *******************************************************************/

        //==================================================================
        // &#x300A;&#x5251;&#x6307;Offer&#x2014;&#x2014;&#x540D;&#x4F01;&#x9762;&#x8BD5;&#x5B98;&#x7CBE;&#x8BB2;&#x5178;&#x578B;&#x7F16;&#x7A0B;&#x9898;&#x300B;&#x4EE3;&#x7801;
        // &#x4F5C;&#x8005;&#xFF1A;&#x4F55;&#x6D77;&#x6D9B;
        //==================================================================

        // &#x9762;&#x8BD5;&#x9898;43&#xFF1A;&#x4ECE;1&#x5230;n&#x6574;&#x6570;&#x4E2D;1&#x51FA;&#x73B0;&#x7684;&#x6B21;&#x6570;
        // &#x9898;&#x76EE;&#xFF1A;&#x8F93;&#x5165;&#x4E00;&#x4E2A;&#x6574;&#x6570;n&#xFF0C;&#x6C42;&#x4ECE;1&#x5230;n&#x8FD9;n&#x4E2A;&#x6574;&#x6570;&#x7684;&#x5341;&#x8FDB;&#x5236;&#x8868;&#x793A;&#x4E2D;1&#x51FA;&#x73B0;&#x7684;&#x6B21;&#x6570;&#x3002;&#x4F8B;&#x5982;
        // &#x8F93;&#x5165;12&#xFF0C;&#x4ECE;1&#x5230;12&#x8FD9;&#x4E9B;&#x6574;&#x6570;&#x4E2D;&#x5305;&#x542B;1 &#x7684;&#x6570;&#x5B57;&#x6709;1&#xFF0C;10&#xFF0C;11&#x548C;12&#xFF0C;1&#x4E00;&#x5171;&#x51FA;&#x73B0;&#x4E86;5&#x6B21;&#x3002;

        #include <cstdio>
        #include <cstring>
        #include <cstdlib>

        // ====================&#x65B9;&#x6CD5;&#x4E00;====================
        int NumberOf1(unsigned int n);

        int NumberOf1Between1AndN_Solution1(unsigned int n)
        {
            int number = 0;

            for(unsigned int i = 1; i <= 10="=" n; ++ i) number +="NumberOf1(i);" return number; } int numberof1(unsigned n) { while(n) if(n % 1) ++; n="n" 10; =="==================&#x65B9;&#x6CD5;&#x4E8C;====================" numberof1(const char* strn); powerbase10(unsigned n); numberof1between1andn_solution2(int <="0)" 0; char strn[50]; sprintf(strn, "%d", numberof1(strn); strn) if(!strn || *strn '0'> '9' || *strN == '\0')
                return 0;

            int first = *strN - '0';
            unsigned int length = static_cast<unsigned int>(strlen(strN));

            if(length == 1 && first == 0)
                return 0;

            if(length == 1 && first > 0)
                return 1;

            // &#x5047;&#x8BBE;strN&#x662F;"21345"
            // numFirstDigit&#x662F;&#x6570;&#x5B57;10000-19999&#x7684;&#x7B2C;&#x4E00;&#x4E2A;&#x4F4D;&#x4E2D;1&#x7684;&#x6570;&#x76EE;
            int numFirstDigit = 0;
            if(first > 1)
                numFirstDigit = PowerBase10(length - 1);
            else if(first == 1)
                numFirstDigit = atoi(strN + 1) + 1;

            // numOtherDigits&#x662F;01346-21345&#x9664;&#x4E86;&#x7B2C;&#x4E00;&#x4F4D;&#x4E4B;&#x5916;&#x7684;&#x6570;&#x4F4D;&#x4E2D;1&#x7684;&#x6570;&#x76EE;
            int numOtherDigits = first * (length - 1) * PowerBase10(length - 2);
            // numRecursive&#x662F;1-1345&#x4E2D;1&#x7684;&#x6570;&#x76EE;
            int numRecursive = NumberOf1(strN + 1);

            return numFirstDigit + numOtherDigits + numRecursive;
        }

        int PowerBase10(unsigned int n)
        {
            int result = 1;
            for(unsigned int i = 0; i < n; ++ i)
                result *= 10;

            return result;
        }

        // ====================&#x6D4B;&#x8BD5;&#x4EE3;&#x7801;====================
        void Test(const char* testName, int n, int expected)
        {
            if(testName != nullptr)
                printf("%s begins: \n", testName);

            if(NumberOf1Between1AndN_Solution1(n) == expected)
                printf("Solution1 passed.\n");
            else
                printf("Solution1 failed.\n");

            if(NumberOf1Between1AndN_Solution2(n) == expected)
                printf("Solution2 passed.\n");
            else
                printf("Solution2 failed.\n");

            printf("\n");
        }

        void Test()
        {
            Test("Test1", 1, 1);
            Test("Test2", 5, 1);
            Test("Test3", 10, 2);
            Test("Test4", 55, 16);
            Test("Test5", 99, 20);
            Test("Test6", 10000, 4001);
            Test("Test7", 21345, 18821);
            Test("Test8", 0, 0);
        }

        int main(int argc, char* argv[])
        {
            Test();

            return 0;
        }
</unsigned></=></cstdlib></cstring></cstdio>

44. 面试题44:数字序列中某一位的数字

            /*******************************************************************
            Copyright(c) 2016, Harry He
            All rights reserved.

            Distributed under the BSD license.
            (See accompanying file LICENSE.txt at
            https://github.com/zhedahht/CodingInterviewChinese2/blob/master/LICENSE.txt)
            *******************************************************************/

            //==================================================================
            // &#x300A;&#x5251;&#x6307;Offer&#x2014;&#x2014;&#x540D;&#x4F01;&#x9762;&#x8BD5;&#x5B98;&#x7CBE;&#x8BB2;&#x5178;&#x578B;&#x7F16;&#x7A0B;&#x9898;&#x300B;&#x4EE3;&#x7801;
            // &#x4F5C;&#x8005;&#xFF1A;&#x4F55;&#x6D77;&#x6D9B;
            //==================================================================

            // &#x9762;&#x8BD5;&#x9898;44&#xFF1A;&#x6570;&#x5B57;&#x5E8F;&#x5217;&#x4E2D;&#x67D0;&#x4E00;&#x4F4D;&#x7684;&#x6570;&#x5B57;
            // &#x9898;&#x76EE;&#xFF1A;&#x6570;&#x5B57;&#x4EE5;0123456789101112131415&#x2026;&#x7684;&#x683C;&#x5F0F;&#x5E8F;&#x5217;&#x5316;&#x5230;&#x4E00;&#x4E2A;&#x5B57;&#x7B26;&#x5E8F;&#x5217;&#x4E2D;&#x3002;&#x5728;&#x8FD9;
            // &#x4E2A;&#x5E8F;&#x5217;&#x4E2D;&#xFF0C;&#x7B2C;5&#x4F4D;&#xFF08;&#x4ECE;0&#x5F00;&#x59CB;&#x8BA1;&#x6570;&#xFF09;&#x662F;5&#xFF0C;&#x7B2C;13&#x4F4D;&#x662F;1&#xFF0C;&#x7B2C;19&#x4F4D;&#x662F;4&#xFF0C;&#x7B49;&#x7B49;&#x3002;&#x8BF7;&#x5199;&#x4E00;
            // &#x4E2A;&#x51FD;&#x6570;&#x6C42;&#x4EFB;&#x610F;&#x4F4D;&#x5BF9;&#x5E94;&#x7684;&#x6570;&#x5B57;&#x3002;

            #include <iostream>
            #include <algorithm>

            using namespace std;

            int countOfIntegers(int digits);
            int digitAtIndex(int index, int digits);
            int beginNumber(int digits);

            int digitAtIndex(int index)
            {
                if(index < 0)
                    return -1;

                int digits = 1;
                while(true)
                {
                    int numbers = countOfIntegers(digits);
                    if(index < numbers * digits)
                        return digitAtIndex(index, digits);

                    index -= digits * numbers;
                    digits++;
                }

                return -1;
            }

            int countOfIntegers(int digits)
            {
                if(digits == 1)
                    return 10;

                int count = (int) std::pow(10, digits - 1);
                return 9 * count;
            }

            int digitAtIndex(int index, int digits)
            {
                int number = beginNumber(digits) + index / digits;
                int indexFromRight = digits - index % digits;
                for(int i = 1; i < indexFromRight; ++i)
                    number /= 10;
                return number % 10;
            }

            int beginNumber(int digits)
            {
                if(digits == 1)
                    return 0;

                return (int) std::pow(10, digits - 1);
            }

            // ====================&#x6D4B;&#x8BD5;&#x4EE3;&#x7801;====================
            void test(const char* testName, int inputIndex, int expectedOutput)
            {
                if(digitAtIndex(inputIndex) == expectedOutput)
                    cout << testName << " passed." << endl;
                else
                    cout << testName << " FAILED." << endl;
            }

            int main()
            {
                test("Test1", 0, 0);
                test("Test2", 1, 1);
                test("Test3", 9, 9);
                test("Test4", 10, 1);
                test("Test5", 189, 9);  // &#x6570;&#x5B57;99&#x7684;&#x6700;&#x540E;&#x4E00;&#x4F4D;&#xFF0C;9
                test("Test6", 190, 1);  // &#x6570;&#x5B57;100&#x7684;&#x7B2C;&#x4E00;&#x4F4D;&#xFF0C;1
                test("Test7", 1000, 3); // &#x6570;&#x5B57;370&#x7684;&#x7B2C;&#x4E00;&#x4F4D;&#xFF0C;3
                test("Test8", 1001, 7); // &#x6570;&#x5B57;370&#x7684;&#x7B2C;&#x4E8C;&#x4F4D;&#xFF0C;7
                test("Test9", 1002, 0); // &#x6570;&#x5B57;370&#x7684;&#x7B2C;&#x4E09;&#x4F4D;&#xFF0C;0
                return 0;
            }
</algorithm></iostream>

45. 面试题45:把数组排成最小的数

            /*******************************************************************
            Copyright(c) 2016, Harry He
            All rights reserved.

            Distributed under the BSD license.
            (See accompanying file LICENSE.txt at
            https://github.com/zhedahht/CodingInterviewChinese2/blob/master/LICENSE.txt)
            *******************************************************************/

            //==================================================================
            // &#x300A;&#x5251;&#x6307;Offer&#x2014;&#x2014;&#x540D;&#x4F01;&#x9762;&#x8BD5;&#x5B98;&#x7CBE;&#x8BB2;&#x5178;&#x578B;&#x7F16;&#x7A0B;&#x9898;&#x300B;&#x4EE3;&#x7801;
            // &#x4F5C;&#x8005;&#xFF1A;&#x4F55;&#x6D77;&#x6D9B;
            //==================================================================

            // &#x9762;&#x8BD5;&#x9898;45&#xFF1A;&#x628A;&#x6570;&#x7EC4;&#x6392;&#x6210;&#x6700;&#x5C0F;&#x7684;&#x6570;
            // &#x9898;&#x76EE;&#xFF1A;&#x8F93;&#x5165;&#x4E00;&#x4E2A;&#x6B63;&#x6574;&#x6570;&#x6570;&#x7EC4;&#xFF0C;&#x628A;&#x6570;&#x7EC4;&#x91CC;&#x6240;&#x6709;&#x6570;&#x5B57;&#x62FC;&#x63A5;&#x8D77;&#x6765;&#x6392;&#x6210;&#x4E00;&#x4E2A;&#x6570;&#xFF0C;&#x6253;&#x5370;&#x80FD;&#x62FC;
            // &#x63A5;&#x51FA;&#x7684;&#x6240;&#x6709;&#x6570;&#x5B57;&#x4E2D;&#x6700;&#x5C0F;&#x7684;&#x4E00;&#x4E2A;&#x3002;&#x4F8B;&#x5982;&#x8F93;&#x5165;&#x6570;&#x7EC4;{3, 32, 321}&#xFF0C;&#x5219;&#x6253;&#x5370;&#x51FA;&#x8FD9;3&#x4E2A;&#x6570;
            // &#x5B57;&#x80FD;&#x6392;&#x6210;&#x7684;&#x6700;&#x5C0F;&#x6570;&#x5B57;321323&#x3002;

            #include "cstdio"
            #include <string>
            #include <algorithm>

            int compare(const void* strNumber1, const void* strNumber2);

            // int&#x578B;&#x6574;&#x6570;&#x7528;&#x5341;&#x8FDB;&#x5236;&#x8868;&#x793A;&#x6700;&#x591A;&#x53EA;&#x6709;10&#x4F4D;
            const int g_MaxNumberLength = 10;

            char* g_StrCombine1 = new char[g_MaxNumberLength * 2 + 1];
            char* g_StrCombine2 = new char[g_MaxNumberLength * 2 + 1];

            void PrintMinNumber(const int* numbers, int length)
            {
                if(numbers == nullptr || length <= 0) return; char** strnumbers="(char**)(new" int[length]); for(int i="0;" < length; ++i) { strnumbers[i]="new" char[g_maxnumberlength + 1]; sprintf(strnumbers[i], "%d", numbers[i]); } qsort(strnumbers, length, sizeof(char*), compare); printf("%s", strnumbers[i]); printf("\n"); delete[] strnumbers[i]; strnumbers; 如果[strnumber1][strnumber2]> [strNumber2][strNumber1], &#x8FD4;&#x56DE;&#x503C;&#x5927;&#x4E8E;0
            // &#x5982;&#x679C;[strNumber1][strNumber2] = [strNumber2][strNumber1], &#x8FD4;&#x56DE;&#x503C;&#x7B49;&#x4E8E;0
            // &#x5982;&#x679C;[strNumber1][strNumber2] < [strNumber2][strNumber1], &#x8FD4;&#x56DE;&#x503C;&#x5C0F;&#x4E8E;0
            int compare(const void* strNumber1, const void* strNumber2)
            {
                // [strNumber1][strNumber2]
                strcpy(g_StrCombine1, *(const char**)strNumber1);
                strcat(g_StrCombine1, *(const char**)strNumber2);

                // [strNumber2][strNumber1]
                strcpy(g_StrCombine2, *(const char**)strNumber2);
                strcat(g_StrCombine2, *(const char**)strNumber1);

                return strcmp(g_StrCombine1, g_StrCombine2);
            }

            // ====================&#x6D4B;&#x8BD5;&#x4EE3;&#x7801;====================
            void Test(const char* testName, int* numbers, int length, const char* expectedResult)
            {
                if(testName != nullptr)
                    printf("%s begins:\n", testName);

                if(expectedResult != nullptr)
                    printf("Expected result is: \t%s\n", expectedResult);

                printf("Actual result is: \t");
                PrintMinNumber(numbers, length);

                printf("\n");
            }

            void Test1()
            {
                int numbers[] = {3, 5, 1, 4, 2};
                Test("Test1", numbers, sizeof(numbers)/sizeof(int), "12345");
            }

            void Test2()
            {
                int numbers[] = {3, 32, 321};
                Test("Test2", numbers, sizeof(numbers)/sizeof(int), "321323");
            }

            void Test3()
            {
                int numbers[] = {3, 323, 32123};
                Test("Test3", numbers, sizeof(numbers)/sizeof(int), "321233233");
            }

            void Test4()
            {
                int numbers[] = {1, 11, 111};
                Test("Test4", numbers, sizeof(numbers)/sizeof(int), "111111");
            }

            // &#x6570;&#x7EC4;&#x4E2D;&#x53EA;&#x6709;&#x4E00;&#x4E2A;&#x6570;&#x5B57;
            void Test5()
            {
                int numbers[] = {321};
                Test("Test5", numbers, sizeof(numbers)/sizeof(int), "321");
            }

            void Test6()
            {
                Test("Test6", nullptr, 0, "Don't print anything.");
            }

            int main(int argc, char* argv[])
            {
                Test1();
                Test2();
                Test3();
                Test4();
                Test5();
                Test6();

                return 0;
            }
</=></algorithm></string>

51. 面试题51:数组中的逆序对

        /*******************************************************************
        Copyright(c) 2016, Harry He
        All rights reserved.

        Distributed under the BSD license.
        (See accompanying file LICENSE.txt at
        https://github.com/zhedahht/CodingInterviewChinese2/blob/master/LICENSE.txt)
        *******************************************************************/

        //==================================================================
        // &#x300A;&#x5251;&#x6307;Offer&#x2014;&#x2014;&#x540D;&#x4F01;&#x9762;&#x8BD5;&#x5B98;&#x7CBE;&#x8BB2;&#x5178;&#x578B;&#x7F16;&#x7A0B;&#x9898;&#x300B;&#x4EE3;&#x7801;
        // &#x4F5C;&#x8005;&#xFF1A;&#x4F55;&#x6D77;&#x6D9B;
        //==================================================================

        // &#x9762;&#x8BD5;&#x9898;51&#xFF1A;&#x6570;&#x7EC4;&#x4E2D;&#x7684;&#x9006;&#x5E8F;&#x5BF9;
        // &#x9898;&#x76EE;&#xFF1A;&#x5728;&#x6570;&#x7EC4;&#x4E2D;&#x7684;&#x4E24;&#x4E2A;&#x6570;&#x5B57;&#x5982;&#x679C;&#x524D;&#x9762;&#x4E00;&#x4E2A;&#x6570;&#x5B57;&#x5927;&#x4E8E;&#x540E;&#x9762;&#x7684;&#x6570;&#x5B57;&#xFF0C;&#x5219;&#x8FD9;&#x4E24;&#x4E2A;&#x6570;&#x5B57;&#x7EC4;
        // &#x6210;&#x4E00;&#x4E2A;&#x9006;&#x5E8F;&#x5BF9;&#x3002;&#x8F93;&#x5165;&#x4E00;&#x4E2A;&#x6570;&#x7EC4;&#xFF0C;&#x6C42;&#x51FA;&#x8FD9;&#x4E2A;&#x6570;&#x7EC4;&#x4E2D;&#x7684;&#x9006;&#x5E8F;&#x5BF9;&#x7684;&#x603B;&#x6570;&#x3002;

        #include <cstdio>

        int InversePairsCore(int* data, int* copy, int start, int end);

        int InversePairs(int* data, int length)
        {
            if(data == nullptr || length < 0)
                return 0;

            int* copy = new int[length];
            for(int i = 0; i < length; ++i)
                copy[i] = data[i];

            int count = InversePairsCore(data, copy, 0, length - 1);
            delete[] copy;

            return count;
        }

        int InversePairsCore(int* data, int* copy, int start, int end)
        {
            if(start == end)
            {
                copy[start] = data[start];
                return 0;
            }

            int length = (end - start) / 2;

            int left = InversePairsCore(copy, data, start, start + length);
            int right = InversePairsCore(copy, data, start + length + 1, end);

            // i&#x521D;&#x59CB;&#x5316;&#x4E3A;&#x524D;&#x534A;&#x6BB5;&#x6700;&#x540E;&#x4E00;&#x4E2A;&#x6570;&#x5B57;&#x7684;&#x4E0B;&#x6807;
            int i = start + length;
            // j&#x521D;&#x59CB;&#x5316;&#x4E3A;&#x540E;&#x534A;&#x6BB5;&#x6700;&#x540E;&#x4E00;&#x4E2A;&#x6570;&#x5B57;&#x7684;&#x4E0B;&#x6807;
            int j = end;
            int indexCopy = end;
            int count = 0;
            while(i >= start && j >= start + length + 1)
            {
                if(data[i] > data[j])
                {
                    copy[indexCopy--] = data[i--];
                    count += j - start - length;
                }
                else
                {
                    copy[indexCopy--] = data[j--];
                }
            }

            for(; i >= start; --i)
                copy[indexCopy--] = data[i];

            for(; j >= start + length + 1; --j)
                copy[indexCopy--] = data[j];

            return left + right + count;
        }

        // ====================&#x6D4B;&#x8BD5;&#x4EE3;&#x7801;====================
        void Test(char* testName, int* data, int length, int expected)
        {
            if(testName != nullptr)
                printf("%s begins: ", testName);

            if(InversePairs(data, length) == expected)
                printf("Passed.\n");
            else
                printf("Failed.\n");
        }

        void Test1()
        {
            int data[] = { 1, 2, 3, 4, 7, 6, 5 };
            int expected = 3;

            Test("Test1", data, sizeof(data) / sizeof(int), expected);
        }

        // &#x9012;&#x51CF;&#x6392;&#x5E8F;&#x6570;&#x7EC4;
        void Test2()
        {
            int data[] = { 6, 5, 4, 3, 2, 1 };
            int expected = 15;

            Test("Test2", data, sizeof(data) / sizeof(int), expected);
        }

        // &#x9012;&#x589E;&#x6392;&#x5E8F;&#x6570;&#x7EC4;
        void Test3()
        {
            int data[] = { 1, 2, 3, 4, 5, 6 };
            int expected = 0;

            Test("Test3", data, sizeof(data) / sizeof(int), expected);
        }

        // &#x6570;&#x7EC4;&#x4E2D;&#x53EA;&#x6709;&#x4E00;&#x4E2A;&#x6570;&#x5B57;
        void Test4()
        {
            int data[] = { 1 };
            int expected = 0;

            Test("Test4", data, sizeof(data) / sizeof(int), expected);
        }

        // &#x6570;&#x7EC4;&#x4E2D;&#x53EA;&#x6709;&#x4E24;&#x4E2A;&#x6570;&#x5B57;&#xFF0C;&#x9012;&#x589E;&#x6392;&#x5E8F;
        void Test5()
        {
            int data[] = { 1, 2 };
            int expected = 0;

            Test("Test5", data, sizeof(data) / sizeof(int), expected);
        }

        // &#x6570;&#x7EC4;&#x4E2D;&#x53EA;&#x6709;&#x4E24;&#x4E2A;&#x6570;&#x5B57;&#xFF0C;&#x9012;&#x51CF;&#x6392;&#x5E8F;
        void Test6()
        {
            int data[] = { 2, 1 };
            int expected = 1;

            Test("Test6", data, sizeof(data) / sizeof(int), expected);
        }

        // &#x6570;&#x7EC4;&#x4E2D;&#x6709;&#x76F8;&#x7B49;&#x7684;&#x6570;&#x5B57;
        void Test7()
        {
            int data[] = { 1, 2, 1, 2, 1 };
            int expected = 3;

            Test("Test7", data, sizeof(data) / sizeof(int), expected);
        }

        void Test8()
        {
            int expected = 0;

            Test("Test8", nullptr, 0, expected);
        }

        int main(int argc, char* argv[])
        {
            Test1();
            Test2();
            Test3();
            Test4();
            Test5();
            Test6();
            Test7();
            Test8();

            return 0;
        }
</cstdio>

53. 面试题53:数字在排序数组中出现的次数

        /*******************************************************************
        Copyright(c) 2016, Harry He
        All rights reserved.

        Distributed under the BSD license.
        (See accompanying file LICENSE.txt at
        https://github.com/zhedahht/CodingInterviewChinese2/blob/master/LICENSE.txt)
        *******************************************************************/

        //==================================================================
        // &#x300A;&#x5251;&#x6307;Offer&#x2014;&#x2014;&#x540D;&#x4F01;&#x9762;&#x8BD5;&#x5B98;&#x7CBE;&#x8BB2;&#x5178;&#x578B;&#x7F16;&#x7A0B;&#x9898;&#x300B;&#x4EE3;&#x7801;
        // &#x4F5C;&#x8005;&#xFF1A;&#x4F55;&#x6D77;&#x6D9B;
        //==================================================================

        // &#x9762;&#x8BD5;&#x9898;53&#xFF08;&#x4E00;&#xFF09;&#xFF1A;&#x6570;&#x5B57;&#x5728;&#x6392;&#x5E8F;&#x6570;&#x7EC4;&#x4E2D;&#x51FA;&#x73B0;&#x7684;&#x6B21;&#x6570;
        // &#x9898;&#x76EE;&#xFF1A;&#x7EDF;&#x8BA1;&#x4E00;&#x4E2A;&#x6570;&#x5B57;&#x5728;&#x6392;&#x5E8F;&#x6570;&#x7EC4;&#x4E2D;&#x51FA;&#x73B0;&#x7684;&#x6B21;&#x6570;&#x3002;&#x4F8B;&#x5982;&#x8F93;&#x5165;&#x6392;&#x5E8F;&#x6570;&#x7EC4;{1, 2, 3, 3,
        // 3, 3, 4, 5}&#x548C;&#x6570;&#x5B57;3&#xFF0C;&#x7531;&#x4E8E;3&#x5728;&#x8FD9;&#x4E2A;&#x6570;&#x7EC4;&#x4E2D;&#x51FA;&#x73B0;&#x4E86;4&#x6B21;&#xFF0C;&#x56E0;&#x6B64;&#x8F93;&#x51FA;4&#x3002;

        #include <cstdio>

        int GetFirstK(const int* data, int length, int k, int start, int end);
        int GetLastK(const int* data, int length, int k, int start, int end);

        int GetNumberOfK(const int* data, int length, int k)
        {
            int number = 0;

            if(data != nullptr && length > 0)
            {
                int first = GetFirstK(data, length, k, 0, length - 1);
                int last = GetLastK(data, length, k, 0, length - 1);

                if(first > -1 && last > -1)
                    number = last - first + 1;
            }

            return number;
        }

        // &#x627E;&#x5230;&#x6570;&#x7EC4;&#x4E2D;&#x7B2C;&#x4E00;&#x4E2A;k&#x7684;&#x4E0B;&#x6807;&#x3002;&#x5982;&#x679C;&#x6570;&#x7EC4;&#x4E2D;&#x4E0D;&#x5B58;&#x5728;k&#xFF0C;&#x8FD4;&#x56DE;-1
        int GetFirstK(const int* data, int length, int k, int start, int end)
        {
            if(start > end)
                return -1;

            int middleIndex = (start + end) / 2;
            int middleData = data[middleIndex];

            if(middleData == k)
            {
                if((middleIndex > 0 && data[middleIndex - 1] != k)
                    || middleIndex == 0)
                    return middleIndex;
                else
                    end  = middleIndex - 1;
            }
            else if(middleData > k)
                end = middleIndex - 1;
            else
                start = middleIndex + 1;

            return GetFirstK(data, length, k, start, end);
        }

        // &#x627E;&#x5230;&#x6570;&#x7EC4;&#x4E2D;&#x6700;&#x540E;&#x4E00;&#x4E2A;k&#x7684;&#x4E0B;&#x6807;&#x3002;&#x5982;&#x679C;&#x6570;&#x7EC4;&#x4E2D;&#x4E0D;&#x5B58;&#x5728;k&#xFF0C;&#x8FD4;&#x56DE;-1
        int GetLastK(const int* data, int length, int k, int start, int end)
        {
            if(start > end)
                return -1;

            int middleIndex = (start + end) / 2;
            int middleData = data[middleIndex];

            if(middleData == k)
            {
                if((middleIndex < length - 1 && data[middleIndex + 1] != k)
                    || middleIndex == length - 1)
                    return middleIndex;
                else
                    start  = middleIndex + 1;
            }
            else if(middleData < k)
                start = middleIndex + 1;
            else
                end = middleIndex - 1;

            return GetLastK(data, length, k, start, end);
        }

        // ====================&#x6D4B;&#x8BD5;&#x4EE3;&#x7801;====================
        void Test(const char* testName, int data[], int length, int k, int expected)
        {
            if(testName != nullptr)
                printf("%s begins: ", testName);

            int result = GetNumberOfK(data, length, k);
            if(result == expected)
                printf("Passed.\n");
            else
                printf("Failed.\n");
        }

        // &#x67E5;&#x627E;&#x7684;&#x6570;&#x5B57;&#x51FA;&#x73B0;&#x5728;&#x6570;&#x7EC4;&#x7684;&#x4E2D;&#x95F4;
        void Test1()
        {
            int data[] = {1, 2, 3, 3, 3, 3, 4, 5};
            Test("Test1", data, sizeof(data) / sizeof(int), 3, 4);
        }

        // &#x67E5;&#x627E;&#x7684;&#x6570;&#x7EC4;&#x51FA;&#x73B0;&#x5728;&#x6570;&#x7EC4;&#x7684;&#x5F00;&#x5934;
        void Test2()
        {
            int data[] = {3, 3, 3, 3, 4, 5};
            Test("Test2", data, sizeof(data) / sizeof(int), 3, 4);
        }

        // &#x67E5;&#x627E;&#x7684;&#x6570;&#x7EC4;&#x51FA;&#x73B0;&#x5728;&#x6570;&#x7EC4;&#x7684;&#x7ED3;&#x5C3E;
        void Test3()
        {
            int data[] = {1, 2, 3, 3, 3, 3};
            Test("Test3", data, sizeof(data) / sizeof(int), 3, 4);
        }

        // &#x67E5;&#x627E;&#x7684;&#x6570;&#x5B57;&#x4E0D;&#x5B58;&#x5728;
        void Test4()
        {
            int data[] = {1, 3, 3, 3, 3, 4, 5};
            Test("Test4", data, sizeof(data) / sizeof(int), 2, 0);
        }

        // &#x67E5;&#x627E;&#x7684;&#x6570;&#x5B57;&#x6BD4;&#x7B2C;&#x4E00;&#x4E2A;&#x6570;&#x5B57;&#x8FD8;&#x5C0F;&#xFF0C;&#x4E0D;&#x5B58;&#x5728;
        void Test5()
        {
            int data[] = {1, 3, 3, 3, 3, 4, 5};
            Test("Test5", data, sizeof(data) / sizeof(int), 0, 0);
        }

        // &#x67E5;&#x627E;&#x7684;&#x6570;&#x5B57;&#x6BD4;&#x6700;&#x540E;&#x4E00;&#x4E2A;&#x6570;&#x5B57;&#x8FD8;&#x5927;&#xFF0C;&#x4E0D;&#x5B58;&#x5728;
        void Test6()
        {
            int data[] = {1, 3, 3, 3, 3, 4, 5};
            Test("Test6", data, sizeof(data) / sizeof(int), 6, 0);
        }

        // &#x6570;&#x7EC4;&#x4E2D;&#x7684;&#x6570;&#x5B57;&#x4ECE;&#x5934;&#x5230;&#x5C3E;&#x90FD;&#x662F;&#x67E5;&#x627E;&#x7684;&#x6570;&#x5B57;
        void Test7()
        {
            int data[] = {3, 3, 3, 3};
            Test("Test7", data, sizeof(data) / sizeof(int), 3, 4);
        }

        // &#x6570;&#x7EC4;&#x4E2D;&#x7684;&#x6570;&#x5B57;&#x4ECE;&#x5934;&#x5230;&#x5C3E;&#x53EA;&#x6709;&#x4E00;&#x4E2A;&#x91CD;&#x590D;&#x7684;&#x6570;&#x5B57;&#xFF0C;&#x4E0D;&#x662F;&#x67E5;&#x627E;&#x7684;&#x6570;&#x5B57;
        void Test8()
        {
            int data[] = {3, 3, 3, 3};
            Test("Test8", data, sizeof(data) / sizeof(int), 4, 0);
        }

        // &#x6570;&#x7EC4;&#x4E2D;&#x53EA;&#x6709;&#x4E00;&#x4E2A;&#x6570;&#x5B57;&#xFF0C;&#x662F;&#x67E5;&#x627E;&#x7684;&#x6570;&#x5B57;
        void Test9()
        {
            int data[] = {3};
            Test("Test9", data, sizeof(data) / sizeof(int), 3, 1);
        }

        // &#x6570;&#x7EC4;&#x4E2D;&#x53EA;&#x6709;&#x4E00;&#x4E2A;&#x6570;&#x5B57;&#xFF0C;&#x4E0D;&#x662F;&#x67E5;&#x627E;&#x7684;&#x6570;&#x5B57;
        void Test10()
        {
            int data[] = {3};
            Test("Test10", data, sizeof(data) / sizeof(int), 4, 0);
        }

        // &#x9C81;&#x68D2;&#x6027;&#x6D4B;&#x8BD5;&#xFF0C;&#x6570;&#x7EC4;&#x7A7A;&#x6307;&#x9488;
        void Test11()
        {
            Test("Test11", nullptr, 0, 0, 0);
        }

        int main(int argc, char* argv[])
        {
            Test1();
            Test2();
            Test3();
            Test4();
            Test5();
            Test6();
            Test7();
            Test8();
            Test9();
            Test10();
            Test11();

            return 0;
        }
</cstdio>
            /*******************************************************************
            Copyright(c) 2016, Harry He
            All rights reserved.

            Distributed under the BSD license.
            (See accompanying file LICENSE.txt at
            https://github.com/zhedahht/CodingInterviewChinese2/blob/master/LICENSE.txt)
            *******************************************************************/

            //==================================================================
            // &#x300A;&#x5251;&#x6307;Offer&#x2014;&#x2014;&#x540D;&#x4F01;&#x9762;&#x8BD5;&#x5B98;&#x7CBE;&#x8BB2;&#x5178;&#x578B;&#x7F16;&#x7A0B;&#x9898;&#x300B;&#x4EE3;&#x7801;
            // &#x4F5C;&#x8005;&#xFF1A;&#x4F55;&#x6D77;&#x6D9B;
            //==================================================================

            // &#x9762;&#x8BD5;&#x9898;53&#xFF08;&#x4E8C;&#xFF09;&#xFF1A;0&#x5230;n-1&#x4E2D;&#x7F3A;&#x5931;&#x7684;&#x6570;&#x5B57;
            // &#x9898;&#x76EE;&#xFF1A;&#x4E00;&#x4E2A;&#x957F;&#x5EA6;&#x4E3A;n-1&#x7684;&#x9012;&#x589E;&#x6392;&#x5E8F;&#x6570;&#x7EC4;&#x4E2D;&#x7684;&#x6240;&#x6709;&#x6570;&#x5B57;&#x90FD;&#x662F;&#x552F;&#x4E00;&#x7684;&#xFF0C;&#x5E76;&#x4E14;&#x6BCF;&#x4E2A;&#x6570;&#x5B57;
            // &#x90FD;&#x5728;&#x8303;&#x56F4;0&#x5230;n-1&#x4E4B;&#x5185;&#x3002;&#x5728;&#x8303;&#x56F4;0&#x5230;n-1&#x7684;n&#x4E2A;&#x6570;&#x5B57;&#x4E2D;&#x6709;&#x4E14;&#x53EA;&#x6709;&#x4E00;&#x4E2A;&#x6570;&#x5B57;&#x4E0D;&#x5728;&#x8BE5;&#x6570;&#x7EC4;
            // &#x4E2D;&#xFF0C;&#x8BF7;&#x627E;&#x51FA;&#x8FD9;&#x4E2A;&#x6570;&#x5B57;&#x3002;

            #include <cstdio>

            int GetMissingNumber(const int* numbers, int length)
            {
                if(numbers == nullptr || length <= 0) return -1; int left="0;" right="length" - 1; while(left <="right)" { middle="(right" + left)>> 1;
                    if(numbers[middle] != middle)
                    {
                        if(middle == 0 || numbers[middle - 1] == middle - 1)
                            return middle;
                        right = middle - 1;
                    }
                    else
                        left = middle + 1;
                }

                if(left == length)
                    return length;

                // &#x65E0;&#x6548;&#x7684;&#x8F93;&#x5165;&#xFF0C;&#x6BD4;&#x5982;&#x6570;&#x7EC4;&#x4E0D;&#x662F;&#x6309;&#x8981;&#x6C42;&#x6392;&#x5E8F;&#x7684;&#xFF0C;
                // &#x6216;&#x8005;&#x6709;&#x6570;&#x5B57;&#x4E0D;&#x5728;0&#x5230;n-1&#x8303;&#x56F4;&#x4E4B;&#x5185;
                return -1;
            }

            // ====================&#x6D4B;&#x8BD5;&#x4EE3;&#x7801;====================
            void Test(const char* testName, int numbers[], int length, int expected)
            {
                if(testName != nullptr)
                    printf("%s begins: ", testName);

                int result = GetMissingNumber(numbers, length);
                if(result == expected)
                    printf("Passed.\n");
                else
                    printf("Failed.\n");
            }

            // &#x7F3A;&#x5931;&#x7684;&#x662F;&#x7B2C;&#x4E00;&#x4E2A;&#x6570;&#x5B57;0
            void Test1()
            {
                int numbers[] = { 1, 2, 3, 4, 5 };
                int expected = 0;
                Test("Test1", numbers, sizeof(numbers) / sizeof(int), expected);
            }

            // &#x7F3A;&#x5931;&#x7684;&#x662F;&#x6700;&#x540E;&#x4E00;&#x4E2A;&#x6570;&#x5B57;
            void Test2()
            {
                int numbers[] = { 0, 1, 2, 3, 4 };
                int expected = 5;
                Test("Test2", numbers, sizeof(numbers) / sizeof(int), expected);
            }

            // &#x7F3A;&#x5931;&#x7684;&#x662F;&#x4E2D;&#x95F4;&#x67D0;&#x4E2A;&#x6570;&#x5B57;0
            void Test3()
            {
                int numbers[] = { 0, 1, 2, 4, 5 };
                int expected = 3;
                Test("Test3", numbers, sizeof(numbers) / sizeof(int), expected);
            }

            // &#x6570;&#x7EC4;&#x4E2D;&#x53EA;&#x6709;&#x4E00;&#x4E2A;&#x6570;&#x5B57;&#xFF0C;&#x7F3A;&#x5931;&#x7684;&#x662F;&#x7B2C;&#x4E00;&#x4E2A;&#x6570;&#x5B57;0
            void Test4()
            {
                int numbers[] = { 1 };
                int expected = 0;
                Test("Test4", numbers, sizeof(numbers) / sizeof(int), expected);
            }

            // &#x6570;&#x7EC4;&#x4E2D;&#x53EA;&#x6709;&#x4E00;&#x4E2A;&#x6570;&#x5B57;&#xFF0C;&#x7F3A;&#x5931;&#x7684;&#x662F;&#x6700;&#x540E;&#x4E00;&#x4E2A;&#x6570;&#x5B57;1
            void Test5()
            {
                int numbers[] = { 0 };
                int expected = 1;
                Test("Test5", numbers, sizeof(numbers) / sizeof(int), expected);
            }

            // &#x7A7A;&#x6570;&#x7EC4;
            void Test6()
            {
                int expected = -1;
                Test("Test6", nullptr, 0, expected);
            }

            int main(int argc, char* argv[])
            {
                Test1();
                Test2();
                Test3();
                Test4();
                Test5();
                Test6();

                return 0;
            }
</=></cstdio>
        /*******************************************************************
        Copyright(c) 2016, Harry He
        All rights reserved.

        Distributed under the BSD license.
        (See accompanying file LICENSE.txt at
        https://github.com/zhedahht/CodingInterviewChinese2/blob/master/LICENSE.txt)
        *******************************************************************/

        //==================================================================
        // &#x300A;&#x5251;&#x6307;Offer&#x2014;&#x2014;&#x540D;&#x4F01;&#x9762;&#x8BD5;&#x5B98;&#x7CBE;&#x8BB2;&#x5178;&#x578B;&#x7F16;&#x7A0B;&#x9898;&#x300B;&#x4EE3;&#x7801;
        // &#x4F5C;&#x8005;&#xFF1A;&#x4F55;&#x6D77;&#x6D9B;
        //==================================================================

        // &#x9762;&#x8BD5;&#x9898;53&#xFF08;&#x4E09;&#xFF09;&#xFF1A;&#x6570;&#x7EC4;&#x4E2D;&#x6570;&#x503C;&#x548C;&#x4E0B;&#x6807;&#x76F8;&#x7B49;&#x7684;&#x5143;&#x7D20;
        // &#x9898;&#x76EE;&#xFF1A;&#x5047;&#x8BBE;&#x4E00;&#x4E2A;&#x5355;&#x8C03;&#x9012;&#x589E;&#x7684;&#x6570;&#x7EC4;&#x91CC;&#x7684;&#x6BCF;&#x4E2A;&#x5143;&#x7D20;&#x90FD;&#x662F;&#x6574;&#x6570;&#x5E76;&#x4E14;&#x662F;&#x552F;&#x4E00;&#x7684;&#x3002;&#x8BF7;&#x7F16;&#x7A0B;&#x5B9E;
        // &#x73B0;&#x4E00;&#x4E2A;&#x51FD;&#x6570;&#x627E;&#x51FA;&#x6570;&#x7EC4;&#x4E2D;&#x4EFB;&#x610F;&#x4E00;&#x4E2A;&#x6570;&#x503C;&#x7B49;&#x4E8E;&#x5176;&#x4E0B;&#x6807;&#x7684;&#x5143;&#x7D20;&#x3002;&#x4F8B;&#x5982;&#xFF0C;&#x5728;&#x6570;&#x7EC4;{-3, -1,
        // 1, 3, 5}&#x4E2D;&#xFF0C;&#x6570;&#x5B57;3&#x548C;&#x5B83;&#x7684;&#x4E0B;&#x6807;&#x76F8;&#x7B49;&#x3002;

        #include <cstdio>

        int GetNumberSameAsIndex(const int* numbers, int length)
        {
            if(numbers == nullptr || length <= 0) return -1; int left="0;" right="length" - 1; while(left <="right)" { middle="left" + ((right left)>> 1);
                if(numbers[middle] == middle)
                    return middle;

                if(numbers[middle] > middle)
                    right = middle - 1;
                else
                    left = middle + 1;
            }

            return -1;
        }

        // ====================&#x6D4B;&#x8BD5;&#x4EE3;&#x7801;====================
        void Test(const char* testName, int numbers[], int length, int expected)
        {
            if(GetNumberSameAsIndex(numbers, length) == expected)
                printf("%s passed.\n", testName);
            else
                printf("%s FAILED.\n", testName);
        }

        void Test1()
        {
            int numbers[] = { -3, -1, 1, 3, 5 };
            int expected = 3;
            Test("Test1", numbers, sizeof(numbers) / sizeof(int), expected);
        }

        void Test2()
        {
            int numbers[] = { 0, 1, 3, 5, 6 };
            int expected = 0;
            Test("Test2", numbers, sizeof(numbers) / sizeof(int), expected);
        }

        void Test3()
        {
            int numbers[] = { -1, 0, 1, 2, 4 };
            int expected = 4;
            Test("Test3", numbers, sizeof(numbers) / sizeof(int), expected);
        }

        void Test4()
        {
            int numbers[] = { -1, 0, 1, 2, 5 };
            int expected = -1;
            Test("Test4", numbers, sizeof(numbers) / sizeof(int), expected);
        }

        void Test5()
        {
            int numbers[] = { 0 };
            int expected = 0;
            Test("Test5", numbers, sizeof(numbers) / sizeof(int), expected);
        }

        void Test6()
        {
            int numbers[] = { 10 };
            int expected = -1;
            Test("Test6", numbers, sizeof(numbers) / sizeof(int), expected);
        }

        void Test7()
        {
            Test("Test7", nullptr, 0, -1);
        }

        int main(int argc, char* argv[])
        {
            Test1();
            Test2();
            Test3();
            Test4();
            Test5();
            Test6();
            Test7();

            return 0;
        }
</=></cstdio>

56. 面试题56:数组中只出现一次的两个数字

        /*******************************************************************
        Copyright(c) 2016, Harry He
        All rights reserved.

        Distributed under the BSD license.
        (See accompanying file LICENSE.txt at
        https://github.com/zhedahht/CodingInterviewChinese2/blob/master/LICENSE.txt)
        *******************************************************************/

        //==================================================================
        // &#x300A;&#x5251;&#x6307;Offer&#x2014;&#x2014;&#x540D;&#x4F01;&#x9762;&#x8BD5;&#x5B98;&#x7CBE;&#x8BB2;&#x5178;&#x578B;&#x7F16;&#x7A0B;&#x9898;&#x300B;&#x4EE3;&#x7801;
        // &#x4F5C;&#x8005;&#xFF1A;&#x4F55;&#x6D77;&#x6D9B;
        //==================================================================

        // &#x9762;&#x8BD5;&#x9898;56&#xFF08;&#x4E00;&#xFF09;&#xFF1A;&#x6570;&#x7EC4;&#x4E2D;&#x53EA;&#x51FA;&#x73B0;&#x4E00;&#x6B21;&#x7684;&#x4E24;&#x4E2A;&#x6570;&#x5B57;
        // &#x9898;&#x76EE;&#xFF1A;&#x4E00;&#x4E2A;&#x6574;&#x578B;&#x6570;&#x7EC4;&#x91CC;&#x9664;&#x4E86;&#x4E24;&#x4E2A;&#x6570;&#x5B57;&#x4E4B;&#x5916;&#xFF0C;&#x5176;&#x4ED6;&#x7684;&#x6570;&#x5B57;&#x90FD;&#x51FA;&#x73B0;&#x4E86;&#x4E24;&#x6B21;&#x3002;&#x8BF7;&#x5199;&#x7A0B;&#x5E8F;
        // &#x627E;&#x51FA;&#x8FD9;&#x4E24;&#x4E2A;&#x53EA;&#x51FA;&#x73B0;&#x4E00;&#x6B21;&#x7684;&#x6570;&#x5B57;&#x3002;&#x8981;&#x6C42;&#x65F6;&#x95F4;&#x590D;&#x6742;&#x5EA6;&#x662F;O(n)&#xFF0C;&#x7A7A;&#x95F4;&#x590D;&#x6742;&#x5EA6;&#x662F;O(1)&#x3002;

        #include <cstdio>

        unsigned int FindFirstBitIs1(int num);
        bool IsBit1(int num, unsigned int indexBit);

        void FindNumsAppearOnce(int data[], int length, int* num1, int* num2)
        {
            if(data == nullptr || length < 2)
                return;

            int resultExclusiveOR = 0;
            for(int i = 0; i < length; ++i)
                resultExclusiveOR ^= data[i];

            unsigned int indexOf1 = FindFirstBitIs1(resultExclusiveOR);

            *num1 = *num2 = 0;
            for(int j = 0; j < length; ++j)
            {
                if(IsBit1(data[j], indexOf1))
                    *num1 ^= data[j];
                else
                    *num2 ^= data[j];
            }
        }

        // &#x627E;&#x5230;num&#x4ECE;&#x53F3;&#x8FB9;&#x6570;&#x8D77;&#x7B2C;&#x4E00;&#x4E2A;&#x662F;1&#x7684;&#x4F4D;
        unsigned int FindFirstBitIs1(int num)
        {
            int indexBit = 0;
            while(((num & 1) == 0) && (indexBit < 8 * sizeof(int)))
            {
                num = num >> 1;
                ++indexBit;
            }

            return indexBit;
        }

        // &#x5224;&#x65AD;&#x6570;&#x5B57;num&#x7684;&#x7B2C;indexBit&#x4F4D;&#x662F;&#x4E0D;&#x662F;1
        bool IsBit1(int num, unsigned int indexBit)
        {
            num = num >> indexBit;
            return (num & 1);
        }

        // ====================&#x6D4B;&#x8BD5;&#x4EE3;&#x7801;====================
        void Test(const char* testName, int data[], int length, int expected1, int expected2)
        {
            if(testName != nullptr)
                printf("%s begins: ", testName);

            int result1, result2;
            FindNumsAppearOnce(data, length, &result1, &result2);

            if((expected1 == result1 && expected2 == result2) ||
                (expected2 == result1 && expected1 == result2))
                printf("Passed.\n\n");
            else
                printf("Failed.\n\n");
        }

        void Test1()
        {
            int data[] = { 2, 4, 3, 6, 3, 2, 5, 5 };
            Test("Test1", data, sizeof(data) / sizeof(int), 4, 6);
        }

        void Test2()
        {
            int data[] = { 4, 6 };
            Test("Test2", data, sizeof(data) / sizeof(int), 4, 6);
        }

        void Test3()
        {
            int data[] = { 4, 6, 1, 1, 1, 1 };
            Test("Test3", data, sizeof(data) / sizeof(int), 4, 6);
        }

        int main(int argc, char* argv[])
        {
            Test1();
            Test2();
            Test3();

            return 0;
        }
</cstdio>
        /*******************************************************************
        Copyright(c) 2016, Harry He
        All rights reserved.

        Distributed under the BSD license.
        (See accompanying file LICENSE.txt at
        https://github.com/zhedahht/CodingInterviewChinese2/blob/master/LICENSE.txt)
        *******************************************************************/

        //==================================================================
        // &#x300A;&#x5251;&#x6307;Offer&#x2014;&#x2014;&#x540D;&#x4F01;&#x9762;&#x8BD5;&#x5B98;&#x7CBE;&#x8BB2;&#x5178;&#x578B;&#x7F16;&#x7A0B;&#x9898;&#x300B;&#x4EE3;&#x7801;
        // &#x4F5C;&#x8005;&#xFF1A;&#x4F55;&#x6D77;&#x6D9B;
        //==================================================================

        // &#x9762;&#x8BD5;&#x9898;56&#xFF08;&#x4E8C;&#xFF09;&#xFF1A;&#x6570;&#x7EC4;&#x4E2D;&#x552F;&#x4E00;&#x53EA;&#x51FA;&#x73B0;&#x4E00;&#x6B21;&#x7684;&#x6570;&#x5B57;
        // &#x9898;&#x76EE;&#xFF1A;&#x5728;&#x4E00;&#x4E2A;&#x6570;&#x7EC4;&#x4E2D;&#x9664;&#x4E86;&#x4E00;&#x4E2A;&#x6570;&#x5B57;&#x53EA;&#x51FA;&#x73B0;&#x4E00;&#x6B21;&#x4E4B;&#x5916;&#xFF0C;&#x5176;&#x4ED6;&#x6570;&#x5B57;&#x90FD;&#x51FA;&#x73B0;&#x4E86;&#x4E09;&#x6B21;&#x3002;&#x8BF7;
        // &#x627E;&#x51FA;&#x90A3;&#x4E2A;&#x5403;&#x51FA;&#x73B0;&#x4E00;&#x6B21;&#x7684;&#x6570;&#x5B57;&#x3002;

        #include <cstdio>
        #include <exception>

        int FindNumberAppearingOnce(int numbers[], int length)
        {
            if(numbers == nullptr || length <= 0) throw new std::exception("invalid input."); int bitsum[32]="{0};" for(int i="0;" < length; ++i) { bitmask="1;" j="31;">= 0; --j)
                {
                    int bit = numbers[i] & bitMask;
                    if(bit != 0)
                        bitSum[j] += 1;

                    bitMask = bitMask << 1;
                }
            }

            int result = 0;
            for(int i = 0; i < 32; ++i)
            {
                result = result << 1;
                result += bitSum[i] % 3;
            }

            return result;
        }

        // ====================&#x6D4B;&#x8BD5;&#x4EE3;&#x7801;====================
        void Test(const char* testName, int numbers[], int length, int expected)
        {
            int result = FindNumberAppearingOnce(numbers, length);
            if(result == expected)
                printf("%s passed.\n", testName);
            else
                printf("%s FAILED.\n", testName);
        }

        // &#x6240;&#x6709;&#x6570;&#x5B57;&#x90FD;&#x662F;&#x6B63;&#x6570;&#xFF0C;&#x552F;&#x4E00;&#x7684;&#x6570;&#x5B57;&#x662F;&#x6700;&#x5C0F;&#x7684;
        void Test1()
        {
            int numbers[] = { 1, 1, 2, 2, 2, 1, 3 };
            int expected = 3;
            Test("Test1", numbers, sizeof(numbers) / sizeof(int), expected);
        }

        // &#x6240;&#x6709;&#x6570;&#x5B57;&#x90FD;&#x662F;&#x6B63;&#x6570;&#xFF0C;&#x552F;&#x4E00;&#x7684;&#x6570;&#x5B57;&#x7684;&#x5927;&#x5C0F;&#x4F4D;&#x4E8E;&#x4E2D;&#x95F4;
        void Test2()
        {
            int numbers[] = { 4, 3, 3, 2, 2, 2, 3 };
            int expected = 4;
            Test("Test2", numbers, sizeof(numbers) / sizeof(int), expected);
        }

        // &#x6240;&#x6709;&#x6570;&#x5B57;&#x90FD;&#x662F;&#x6B63;&#x6570;&#xFF0C;&#x552F;&#x4E00;&#x7684;&#x6570;&#x5B57;&#x662F;&#x6700;&#x5927;&#x7684;
        void Test3()
        {
            int numbers[] = { 4, 4, 1, 1, 1, 7, 4 };
            int expected = 7;
            Test("Test3", numbers, sizeof(numbers) / sizeof(int), expected);
        }

        // &#x552F;&#x4E00;&#x7684;&#x6570;&#x5B57;&#x662F;&#x8D1F;&#x6570;
        void Test4()
        {
            int numbers[] = { -10, 214, 214, 214 };
            int expected = -10;
            Test("Test4", numbers, sizeof(numbers) / sizeof(int), expected);
        }

        // &#x9664;&#x4E86;&#x552F;&#x4E00;&#x7684;&#x6570;&#x5B57;&#xFF0C;&#x5176;&#x4ED6;&#x6570;&#x5B57;&#x90FD;&#x662F;&#x8D1F;&#x6570;
        void Test5()
        {
            int numbers[] = { -209, 3467, -209, -209 };
            int expected = 3467;
            Test("Test5", numbers, sizeof(numbers) / sizeof(int), expected);
        }

        // &#x91CD;&#x590D;&#x7684;&#x6570;&#x5B57;&#x6709;&#x6B63;&#x6570;&#x4E5F;&#x6709;&#x8D1F;&#x6570;
        void Test6()
        {
            int numbers[] = { 1024, -1025, 1024, -1025, 1024, -1025, 1023 };
            int expected = 1023;
            Test("Test6", numbers, sizeof(numbers) / sizeof(int), expected);
        }

        // &#x6240;&#x6709;&#x6570;&#x5B57;&#x90FD;&#x662F;&#x8D1F;&#x6570;
        void Test7()
        {
            int numbers[] = { -1024, -1024, -1024, -1023 };
            int expected = -1023;
            Test("Test7", numbers, sizeof(numbers) / sizeof(int), expected);
        }

        // &#x552F;&#x4E00;&#x7684;&#x6570;&#x5B57;&#x662F;0
        void Test8()
        {
            int numbers[] = { -23, 0, 214, -23, 214, -23, 214 };
            int expected = 0;
            Test("Test8", numbers, sizeof(numbers) / sizeof(int), expected);
        }

        // &#x9664;&#x4E86;&#x552F;&#x4E00;&#x7684;&#x6570;&#x5B57;&#xFF0C;&#x5176;&#x4ED6;&#x6570;&#x5B57;&#x90FD;&#x662F;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;
        }
</=></exception></cstdio>

57. 面试题57:和为s的两个数字

        /*******************************************************************
        Copyright(c) 2016, Harry He
        All rights reserved.

        Distributed under the BSD license.
        (See accompanying file LICENSE.txt at
        https://github.com/zhedahht/CodingInterviewChinese2/blob/master/LICENSE.txt)
        *******************************************************************/

        //==================================================================
        // &#x300A;&#x5251;&#x6307;Offer&#x2014;&#x2014;&#x540D;&#x4F01;&#x9762;&#x8BD5;&#x5B98;&#x7CBE;&#x8BB2;&#x5178;&#x578B;&#x7F16;&#x7A0B;&#x9898;&#x300B;&#x4EE3;&#x7801;
        // &#x4F5C;&#x8005;&#xFF1A;&#x4F55;&#x6D77;&#x6D9B;
        //==================================================================

        // &#x9762;&#x8BD5;&#x9898;56&#xFF08;&#x4E8C;&#xFF09;&#xFF1A;&#x6570;&#x7EC4;&#x4E2D;&#x552F;&#x4E00;&#x53EA;&#x51FA;&#x73B0;&#x4E00;&#x6B21;&#x7684;&#x6570;&#x5B57;
        // &#x9898;&#x76EE;&#xFF1A;&#x5728;&#x4E00;&#x4E2A;&#x6570;&#x7EC4;&#x4E2D;&#x9664;&#x4E86;&#x4E00;&#x4E2A;&#x6570;&#x5B57;&#x53EA;&#x51FA;&#x73B0;&#x4E00;&#x6B21;&#x4E4B;&#x5916;&#xFF0C;&#x5176;&#x4ED6;&#x6570;&#x5B57;&#x90FD;&#x51FA;&#x73B0;&#x4E86;&#x4E09;&#x6B21;&#x3002;&#x8BF7;
        // &#x627E;&#x51FA;&#x90A3;&#x4E2A;&#x5403;&#x51FA;&#x73B0;&#x4E00;&#x6B21;&#x7684;&#x6570;&#x5B57;&#x3002;

        #include <cstdio>
        #include <exception>

        int FindNumberAppearingOnce(int numbers[], int length)
        {
            if(numbers == nullptr || length <= 0) throw new std::exception("invalid input."); int bitsum[32]="{0};" for(int i="0;" < length; ++i) { bitmask="1;" j="31;">= 0; --j)
                {
                    int bit = numbers[i] & bitMask;
                    if(bit != 0)
                        bitSum[j] += 1;

                    bitMask = bitMask << 1;
                }
            }

            int result = 0;
            for(int i = 0; i < 32; ++i)
            {
                result = result << 1;
                result += bitSum[i] % 3;
            }

            return result;
        }

        // ====================&#x6D4B;&#x8BD5;&#x4EE3;&#x7801;====================
        void Test(const char* testName, int numbers[], int length, int expected)
        {
            int result = FindNumberAppearingOnce(numbers, length);
            if(result == expected)
                printf("%s passed.\n", testName);
            else
                printf("%s FAILED.\n", testName);
        }

        // &#x6240;&#x6709;&#x6570;&#x5B57;&#x90FD;&#x662F;&#x6B63;&#x6570;&#xFF0C;&#x552F;&#x4E00;&#x7684;&#x6570;&#x5B57;&#x662F;&#x6700;&#x5C0F;&#x7684;
        void Test1()
        {
            int numbers[] = { 1, 1, 2, 2, 2, 1, 3 };
            int expected = 3;
            Test("Test1", numbers, sizeof(numbers) / sizeof(int), expected);
        }

        // &#x6240;&#x6709;&#x6570;&#x5B57;&#x90FD;&#x662F;&#x6B63;&#x6570;&#xFF0C;&#x552F;&#x4E00;&#x7684;&#x6570;&#x5B57;&#x7684;&#x5927;&#x5C0F;&#x4F4D;&#x4E8E;&#x4E2D;&#x95F4;
        void Test2()
        {
            int numbers[] = { 4, 3, 3, 2, 2, 2, 3 };
            int expected = 4;
            Test("Test2", numbers, sizeof(numbers) / sizeof(int), expected);
        }

        // &#x6240;&#x6709;&#x6570;&#x5B57;&#x90FD;&#x662F;&#x6B63;&#x6570;&#xFF0C;&#x552F;&#x4E00;&#x7684;&#x6570;&#x5B57;&#x662F;&#x6700;&#x5927;&#x7684;
        void Test3()
        {
            int numbers[] = { 4, 4, 1, 1, 1, 7, 4 };
            int expected = 7;
            Test("Test3", numbers, sizeof(numbers) / sizeof(int), expected);
        }

        // &#x552F;&#x4E00;&#x7684;&#x6570;&#x5B57;&#x662F;&#x8D1F;&#x6570;
        void Test4()
        {
            int numbers[] = { -10, 214, 214, 214 };
            int expected = -10;
            Test("Test4", numbers, sizeof(numbers) / sizeof(int), expected);
        }

        // &#x9664;&#x4E86;&#x552F;&#x4E00;&#x7684;&#x6570;&#x5B57;&#xFF0C;&#x5176;&#x4ED6;&#x6570;&#x5B57;&#x90FD;&#x662F;&#x8D1F;&#x6570;
        void Test5()
        {
            int numbers[] = { -209, 3467, -209, -209 };
            int expected = 3467;
            Test("Test5", numbers, sizeof(numbers) / sizeof(int), expected);
        }

        // &#x91CD;&#x590D;&#x7684;&#x6570;&#x5B57;&#x6709;&#x6B63;&#x6570;&#x4E5F;&#x6709;&#x8D1F;&#x6570;
        void Test6()
        {
            int numbers[] = { 1024, -1025, 1024, -1025, 1024, -1025, 1023 };
            int expected = 1023;
            Test("Test6", numbers, sizeof(numbers) / sizeof(int), expected);
        }

        // &#x6240;&#x6709;&#x6570;&#x5B57;&#x90FD;&#x662F;&#x8D1F;&#x6570;
        void Test7()
        {
            int numbers[] = { -1024, -1024, -1024, -1023 };
            int expected = -1023;
            Test("Test7", numbers, sizeof(numbers) / sizeof(int), expected);
        }

        // &#x552F;&#x4E00;&#x7684;&#x6570;&#x5B57;&#x662F;0
        void Test8()
        {
            int numbers[] = { -23, 0, 214, -23, 214, -23, 214 };
            int expected = 0;
            Test("Test8", numbers, sizeof(numbers) / sizeof(int), expected);
        }

        // &#x9664;&#x4E86;&#x552F;&#x4E00;&#x7684;&#x6570;&#x5B57;&#xFF0C;&#x5176;&#x4ED6;&#x6570;&#x5B57;&#x90FD;&#x662F;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;
        }
</=></exception></cstdio>
        /*******************************************************************
        Copyright(c) 2016, Harry He
        All rights reserved.

        Distributed under the BSD license.
        (See accompanying file LICENSE.txt at
        https://github.com/zhedahht/CodingInterviewChinese2/blob/master/LICENSE.txt)
        *******************************************************************/

        //==================================================================
        // &#x300A;&#x5251;&#x6307;Offer&#x2014;&#x2014;&#x540D;&#x4F01;&#x9762;&#x8BD5;&#x5B98;&#x7CBE;&#x8BB2;&#x5178;&#x578B;&#x7F16;&#x7A0B;&#x9898;&#x300B;&#x4EE3;&#x7801;
        // &#x4F5C;&#x8005;&#xFF1A;&#x4F55;&#x6D77;&#x6D9B;
        //==================================================================

        // &#x9762;&#x8BD5;&#x9898;57&#xFF08;&#x4E8C;&#xFF09;&#xFF1A;&#x4E3A;s&#x7684;&#x8FDE;&#x7EED;&#x6B63;&#x6570;&#x5E8F;&#x5217;
        // &#x9898;&#x76EE;&#xFF1A;&#x8F93;&#x5165;&#x4E00;&#x4E2A;&#x6B63;&#x6570;s&#xFF0C;&#x6253;&#x5370;&#x51FA;&#x6240;&#x6709;&#x548C;&#x4E3A;s&#x7684;&#x8FDE;&#x7EED;&#x6B63;&#x6570;&#x5E8F;&#x5217;&#xFF08;&#x81F3;&#x5C11;&#x542B;&#x6709;&#x4E24;&#x4E2A;&#x6570;&#xFF09;&#x3002;
        // &#x4F8B;&#x5982;&#x8F93;&#x5165;15&#xFF0C;&#x7531;&#x4E8E;1+2+3+4+5=4+5+6=7+8=15&#xFF0C;&#x6240;&#x4EE5;&#x7ED3;&#x679C;&#x6253;&#x5370;&#x51FA;3&#x4E2A;&#x8FDE;&#x7EED;&#x5E8F;&#x5217;1&#xFF5E;5&#x3001;
        // 4&#xFF5E;6&#x548C;7&#xFF5E;8&#x3002;

        #include <cstdio>

        void PrintContinuousSequence(int small, int big);

        void FindContinuousSequence(int sum)
        {
            if(sum < 3)
                return;

            int small = 1;
            int big = 2;
            int middle = (1 + sum) / 2;
            int curSum = small + big;

            while(small < middle)
            {
                if(curSum == sum)
                    PrintContinuousSequence(small, big);

                while(curSum > sum && small < middle)
                {
                    curSum -= small;
                    small ++;

                    if(curSum == sum)
                        PrintContinuousSequence(small, big);
                }

                big ++;
                curSum += big;
            }
        }

        void PrintContinuousSequence(int small, int big)
        {
            for(int i = small; i <= big; ++ i) printf("%d ", i); printf("\n"); } =="==================&#x6D4B;&#x8BD5;&#x4EE3;&#x7801;====================" void test(const char* testname, int sum) { if(testname !="nullptr)" printf("%s for %d begins: \n", sum); findcontinuoussequence(sum); main(int argc, argv[]) test("test1", 1); test("test2", 3); test("test3", 4); test("test4", 9); test("test5", 15); test("test6", 100); return 0; < code></=></cstdio>

58. 面试题58:翻转单词顺序

        /*******************************************************************
        Copyright(c) 2016, Harry He
        All rights reserved.

        Distributed under the BSD license.
        (See accompanying file LICENSE.txt at
        https://github.com/zhedahht/CodingInterviewChinese2/blob/master/LICENSE.txt)
        *******************************************************************/

        //==================================================================
        // &#x300A;&#x5251;&#x6307;Offer&#x2014;&#x2014;&#x540D;&#x4F01;&#x9762;&#x8BD5;&#x5B98;&#x7CBE;&#x8BB2;&#x5178;&#x578B;&#x7F16;&#x7A0B;&#x9898;&#x300B;&#x4EE3;&#x7801;
        // &#x4F5C;&#x8005;&#xFF1A;&#x4F55;&#x6D77;&#x6D9B;
        //==================================================================

        // &#x9762;&#x8BD5;&#x9898;58&#xFF08;&#x4E00;&#xFF09;&#xFF1A;&#x7FFB;&#x8F6C;&#x5355;&#x8BCD;&#x987A;&#x5E8F;
        // &#x9898;&#x76EE;&#xFF1A;&#x8F93;&#x5165;&#x4E00;&#x4E2A;&#x82F1;&#x6587;&#x53E5;&#x5B50;&#xFF0C;&#x7FFB;&#x8F6C;&#x53E5;&#x5B50;&#x4E2D;&#x5355;&#x8BCD;&#x7684;&#x987A;&#x5E8F;&#xFF0C;&#x4F46;&#x5355;&#x8BCD;&#x5185;&#x5B57;&#x7B26;&#x7684;&#x987A;&#x5E8F;&#x4E0D;&#x53D8;&#x3002;
        // &#x4E3A;&#x7B80;&#x5355;&#x8D77;&#x89C1;&#xFF0C;&#x6807;&#x70B9;&#x7B26;&#x53F7;&#x548C;&#x666E;&#x901A;&#x5B57;&#x6BCD;&#x4E00;&#x6837;&#x5904;&#x7406;&#x3002;&#x4F8B;&#x5982;&#x8F93;&#x5165;&#x5B57;&#x7B26;&#x4E32;"I am a student. "&#xFF0C;
        // &#x5219;&#x8F93;&#x51FA;"student. a am I"&#x3002;

        #include <cstdio>
        #include "..\Utilities\StringUtil.h"
        #include <string>

        char* ReverseSentence(char *pData)
        {
            if(pData == nullptr)
                return nullptr;

            char *pBegin = pData;

            char *pEnd = pData;
            while(*pEnd != '\0')
                pEnd ++;
            pEnd--;

            // &#x7FFB;&#x8F6C;&#x6574;&#x4E2A;&#x53E5;&#x5B50;
            Reverse(pBegin, pEnd);

            // &#x7FFB;&#x8F6C;&#x53E5;&#x5B50;&#x4E2D;&#x7684;&#x6BCF;&#x4E2A;&#x5355;&#x8BCD;
            pBegin = pEnd = pData;
            while(*pBegin != '\0')
            {
                if(*pBegin == ' ')
                {
                    pBegin ++;
                    pEnd ++;
                }
                else if(*pEnd == ' ' || *pEnd == '\0')
                {
                    Reverse(pBegin, --pEnd);
                    pBegin = ++pEnd;
                }
                else
                    pEnd ++;
            }

            return pData;
        }

        // ====================&#x6D4B;&#x8BD5;&#x4EE3;&#x7801;====================
        void Test(const char* testName, char* input, const char* expectedResult)
        {
            if(testName != nullptr)
                printf("%s begins: ", testName);

            ReverseSentence(input);

            if((input == nullptr && expectedResult == nullptr)
                || (input != nullptr && strcmp(input, expectedResult) == 0))
                printf("Passed.\n\n");
            else
                printf("Failed.\n\n");
        }

        // &#x529F;&#x80FD;&#x6D4B;&#x8BD5;&#xFF0C;&#x53E5;&#x5B50;&#x4E2D;&#x6709;&#x591A;&#x4E2A;&#x5355;&#x8BCD;
        void Test1()
        {
            char input[] = "I am a student.";
            char expected[] = "student. a am I";

            Test("Test1", input, expected);
        }

        // &#x529F;&#x80FD;&#x6D4B;&#x8BD5;&#xFF0C;&#x53E5;&#x5B50;&#x4E2D;&#x53EA;&#x6709;&#x4E00;&#x4E2A;&#x5355;&#x8BCD;
        void Test2()
        {
            char input[] = "Wonderful";
            char expected[] = "Wonderful";

            Test("Test2", input, expected);
        }

        // &#x9C81;&#x68D2;&#x6027;&#x6D4B;&#x8BD5;
        void Test3()
        {
            Test("Test3", nullptr, nullptr);
        }

        // &#x8FB9;&#x754C;&#x503C;&#x6D4B;&#x8BD5;&#xFF0C;&#x6D4B;&#x8BD5;&#x7A7A;&#x5B57;&#x7B26;&#x4E32;
        void Test4()
        {
            Test("Test4", "", "");
        }

        // &#x8FB9;&#x754C;&#x503C;&#x6D4B;&#x8BD5;&#xFF0C;&#x5B57;&#x7B26;&#x4E32;&#x4E2D;&#x53EA;&#x6709;&#x7A7A;&#x683C;
        void Test5()
        {
            char input[] = "   ";
            char expected[] = "   ";
            Test("Test5", input, expected);
        }

        int main(int argc, char* argv[])
        {
            Test1();
            Test2();
            Test3();
            Test4();
            Test5();

            return 0;
        }
</string></cstdio>
        /*******************************************************************
        Copyright(c) 2016, Harry He
        All rights reserved.

        Distributed under the BSD license.
        (See accompanying file LICENSE.txt at
        https://github.com/zhedahht/CodingInterviewChinese2/blob/master/LICENSE.txt)
        *******************************************************************/

        //==================================================================
        // &#x300A;&#x5251;&#x6307;Offer&#x2014;&#x2014;&#x540D;&#x4F01;&#x9762;&#x8BD5;&#x5B98;&#x7CBE;&#x8BB2;&#x5178;&#x578B;&#x7F16;&#x7A0B;&#x9898;&#x300B;&#x4EE3;&#x7801;
        // &#x4F5C;&#x8005;&#xFF1A;&#x4F55;&#x6D77;&#x6D9B;
        //==================================================================

        // &#x9762;&#x8BD5;&#x9898;58&#xFF08;&#x4E8C;&#xFF09;&#xFF1A;&#x5DE6;&#x65CB;&#x8F6C;&#x5B57;&#x7B26;&#x4E32;
        // &#x9898;&#x76EE;&#xFF1A;&#x5B57;&#x7B26;&#x4E32;&#x7684;&#x5DE6;&#x65CB;&#x8F6C;&#x64CD;&#x4F5C;&#x662F;&#x628A;&#x5B57;&#x7B26;&#x4E32;&#x524D;&#x9762;&#x7684;&#x82E5;&#x5E72;&#x4E2A;&#x5B57;&#x7B26;&#x8F6C;&#x79FB;&#x5230;&#x5B57;&#x7B26;&#x4E32;&#x7684;&#x5C3E;&#x90E8;&#x3002;
        // &#x8BF7;&#x5B9A;&#x4E49;&#x4E00;&#x4E2A;&#x51FD;&#x6570;&#x5B9E;&#x73B0;&#x5B57;&#x7B26;&#x4E32;&#x5DE6;&#x65CB;&#x8F6C;&#x64CD;&#x4F5C;&#x7684;&#x529F;&#x80FD;&#x3002;&#x6BD4;&#x5982;&#x8F93;&#x5165;&#x5B57;&#x7B26;&#x4E32;"abcdefg"&#x548C;&#x6570;
        // &#x5B57;2&#xFF0C;&#x8BE5;&#x51FD;&#x6570;&#x5C06;&#x8FD4;&#x56DE;&#x5DE6;&#x65CB;&#x8F6C;2&#x4F4D;&#x5F97;&#x5230;&#x7684;&#x7ED3;&#x679C;"cdefgab"&#x3002;

        #include <cstdio>
        #include "..\Utilities\StringUtil.h"
        #include <string.h>

        char* LeftRotateString(char* pStr, int n)
        {
            if(pStr != nullptr)
            {
                int nLength = static_cast<int>(strlen(pStr));
                if(nLength > 0 && n > 0 && n < nLength)
                {
                    char* pFirstStart = pStr;
                    char* pFirstEnd = pStr + n - 1;
                    char* pSecondStart = pStr + n;
                    char* pSecondEnd = pStr + nLength - 1;

                    // &#x7FFB;&#x8F6C;&#x5B57;&#x7B26;&#x4E32;&#x7684;&#x524D;&#x9762;n&#x4E2A;&#x5B57;&#x7B26;
                    Reverse(pFirstStart, pFirstEnd);
                    // &#x7FFB;&#x8F6C;&#x5B57;&#x7B26;&#x4E32;&#x7684;&#x540E;&#x9762;&#x90E8;&#x5206;
                    Reverse(pSecondStart, pSecondEnd);
                    // &#x7FFB;&#x8F6C;&#x6574;&#x4E2A;&#x5B57;&#x7B26;&#x4E32;
                    Reverse(pFirstStart, pSecondEnd);
                }
            }

            return pStr;
        }

        // ====================&#x6D4B;&#x8BD5;&#x4EE3;&#x7801;====================
        void Test(const char* testName, char* input, int num, const char* expectedResult)
        {
            if(testName != nullptr)
                printf("%s begins: ", testName);

            char* result = LeftRotateString(input, num);

            if((input == nullptr && expectedResult == nullptr)
                || (input != nullptr && strcmp(result, expectedResult) == 0))
                printf("Passed.\n\n");
            else
                printf("Failed.\n\n");
        }

        // &#x529F;&#x80FD;&#x6D4B;&#x8BD5;
        void Test1()
        {
            char input[] = "abcdefg";
            char expected[] = "cdefgab";

            Test("Test1", input, 2, expected);
        }

        // &#x8FB9;&#x754C;&#x503C;&#x6D4B;&#x8BD5;
        void Test2()
        {
            char input[] = "abcdefg";
            char expected[] = "bcdefga";

            Test("Test2", input, 1, expected);
        }

        // &#x8FB9;&#x754C;&#x503C;&#x6D4B;&#x8BD5;
        void Test3()
        {
            char input[] = "abcdefg";
            char expected[] = "gabcdef";

            Test("Test3", input, 6, expected);
        }

        // &#x9C81;&#x68D2;&#x6027;&#x6D4B;&#x8BD5;
        void Test4()
        {
            Test("Test4", nullptr, 6, nullptr);
        }

        // &#x9C81;&#x68D2;&#x6027;&#x6D4B;&#x8BD5;
        void Test5()
        {
            char input[] = "abcdefg";
            char expected[] = "abcdefg";

            Test("Test5", input, 0, expected);
        }

        // &#x9C81;&#x68D2;&#x6027;&#x6D4B;&#x8BD5;
        void Test6()
        {
            char input[] = "abcdefg";
            char expected[] = "abcdefg";

            Test("Test6", input, 7, expected);
        }

        int main(int argc, char* argv[])
        {
            Test1();
            Test2();
            Test3();
            Test4();
            Test5();
            Test6();

            return 0;
        }
</int></string.h></cstdio>

59. 面试题59:滑动窗口的最大值

        /*******************************************************************
        Copyright(c) 2016, Harry He
        All rights reserved.

        Distributed under the BSD license.
        (See accompanying file LICENSE.txt at
        https://github.com/zhedahht/CodingInterviewChinese2/blob/master/LICENSE.txt)
        *******************************************************************/

        //==================================================================
        // &#x300A;&#x5251;&#x6307;Offer&#x2014;&#x2014;&#x540D;&#x4F01;&#x9762;&#x8BD5;&#x5B98;&#x7CBE;&#x8BB2;&#x5178;&#x578B;&#x7F16;&#x7A0B;&#x9898;&#x300B;&#x4EE3;&#x7801;
        // &#x4F5C;&#x8005;&#xFF1A;&#x4F55;&#x6D77;&#x6D9B;
        //==================================================================

        // &#x9762;&#x8BD5;&#x9898;59&#xFF08;&#x4E00;&#xFF09;&#xFF1A;&#x6ED1;&#x52A8;&#x7A97;&#x53E3;&#x7684;&#x6700;&#x5927;&#x503C;
        // &#x9898;&#x76EE;&#xFF1A;&#x7ED9;&#x5B9A;&#x4E00;&#x4E2A;&#x6570;&#x7EC4;&#x548C;&#x6ED1;&#x52A8;&#x7A97;&#x53E3;&#x7684;&#x5927;&#x5C0F;&#xFF0C;&#x8BF7;&#x627E;&#x51FA;&#x6240;&#x6709;&#x6ED1;&#x52A8;&#x7A97;&#x53E3;&#x91CC;&#x7684;&#x6700;&#x5927;&#x503C;&#x3002;&#x4F8B;&#x5982;&#xFF0C;
        // &#x5982;&#x679C;&#x8F93;&#x5165;&#x6570;&#x7EC4;{2, 3, 4, 2, 6, 2, 5, 1}&#x53CA;&#x6ED1;&#x52A8;&#x7A97;&#x53E3;&#x7684;&#x5927;&#x5C0F;3&#xFF0C;&#x90A3;&#x4E48;&#x4E00;&#x5171;&#x5B58;&#x5728;6&#x4E2A;
        // &#x6ED1;&#x52A8;&#x7A97;&#x53E3;&#xFF0C;&#x5B83;&#x4EEC;&#x7684;&#x6700;&#x5927;&#x503C;&#x5206;&#x522B;&#x4E3A;{4, 4, 6, 6, 6, 5}&#xFF0C;

        #include <cstdio>
        #include <vector>
        #include <deque>

        using namespace std;

        vector<int> maxInWindows(const vector<int>& num, unsigned int size)
        {
            vector<int> maxInWindows;
            if(num.size() >= size && size >= 1)
            {
                deque<int> index;

                for(unsigned int i = 0; i < size; ++i)
                {
                    while(!index.empty() && num[i] >= num[index.back()])
                        index.pop_back();

                    index.push_back(i);
                }

                for(unsigned int i = size; i < num.size(); ++i)
                {
                    maxInWindows.push_back(num[index.front()]);

                    while(!index.empty() && num[i] >= num[index.back()])
                        index.pop_back();
                    if(!index.empty() && index.front() <= (int) (i - size)) index.pop_front(); index.push_back(i); } maxinwindows.push_back(num[index.front()]); return maxinwindows; =="==================&#x6D4B;&#x8BD5;&#x4EE3;&#x7801;====================" void test(const char* testname, const vector<int>& num, unsigned int size, const vector<int>& expected)
        {
            if(testName != nullptr)
                printf("%s begins: ", testName);

            vector<int> result = maxInWindows(num, size);

            vector<int>::const_iterator iterResult = result.begin();
            vector<int>::const_iterator iterExpected = expected.begin();
            while(iterResult < result.end() && iterExpected < expected.end())
            {
                if(*iterResult != *iterExpected)
                    break;

                ++iterResult;
                ++iterExpected;
            }

            if(iterResult == result.end() && iterExpected == expected.end())
                printf("Passed.\n");
            else
                printf("FAILED.\n");
        }

        void Test1()
        {
            int num[] = { 2, 3, 4, 2, 6, 2, 5, 1 };
            vector<int> vecNumbers(num, num + sizeof(num) / sizeof(int));

            int expected[] = { 4, 4, 6, 6, 6, 5 };
            vector<int> vecExpected(expected, expected + sizeof(expected) / sizeof(int));

            unsigned int size = 3;

            Test("Test1", vecNumbers, size, vecExpected);
        }

        void Test2()
        {
            int num[] = { 1, 3, -1, -3, 5, 3, 6, 7 };
            vector<int> vecNumbers(num, num + sizeof(num) / sizeof(int));

            int expected[] = { 3, 3, 5, 5, 6, 7 };
            vector<int> vecExpected(expected, expected + sizeof(expected) / sizeof(int));

            unsigned int size = 3;

            Test("Test2", vecNumbers, size, vecExpected);
        }

        // &#x8F93;&#x5165;&#x6570;&#x7EC4;&#x5355;&#x8C03;&#x9012;&#x589E;
        void Test3()
        {
            int num[] = { 1, 3, 5, 7, 9, 11, 13, 15 };
            vector<int> vecNumbers(num, num + sizeof(num) / sizeof(int));

            int expected[] = { 7, 9, 11, 13, 15 };
            vector<int> vecExpected(expected, expected + sizeof(expected) / sizeof(int));

            unsigned int size = 4;

            Test("Test3", vecNumbers, size, vecExpected);
        }

        // &#x8F93;&#x5165;&#x6570;&#x7EC4;&#x5355;&#x8C03;&#x9012;&#x51CF;
        void Test4()
        {
            int num[] = { 16, 14, 12, 10, 8, 6, 4 };
            vector<int> vecNumbers(num, num + sizeof(num) / sizeof(int));

            int expected[] = { 16, 14, 12 };
            vector<int> vecExpected(expected, expected + sizeof(expected) / sizeof(int));

            unsigned int size = 5;

            Test("Test4", vecNumbers, size, vecExpected);
        }

        // &#x6ED1;&#x52A8;&#x7A97;&#x53E3;&#x7684;&#x5927;&#x5C0F;&#x4E3A;1
        void Test5()
        {
            int num[] = { 10, 14, 12, 11 };
            vector<int> vecNumbers(num, num + sizeof(num) / sizeof(int));

            int expected[] = { 10, 14, 12, 11 };
            vector<int> vecExpected(expected, expected + sizeof(expected) / sizeof(int));

            unsigned int size = 1;

            Test("Test5", vecNumbers, size, vecExpected);
        }

        // &#x6ED1;&#x52A8;&#x7A97;&#x53E3;&#x7684;&#x5927;&#x5C0F;&#x7B49;&#x4E8E;&#x6570;&#x7EC4;&#x7684;&#x957F;&#x5EA6;
        void Test6()
        {
            int num[] = { 10, 14, 12, 11 };
            vector<int> vecNumbers(num, num + sizeof(num) / sizeof(int));

            int expected[] = { 14 };
            vector<int> vecExpected(expected, expected + sizeof(expected) / sizeof(int));

            unsigned int size = 4;

            Test("Test6", vecNumbers, size, vecExpected);
        }

        // &#x6ED1;&#x52A8;&#x7A97;&#x53E3;&#x7684;&#x5927;&#x5C0F;&#x4E3A;0
        void Test7()
        {
            int num[] = { 10, 14, 12, 11 };
            vector<int> vecNumbers(num, num + sizeof(num) / sizeof(int));

            vector<int> vecExpected;

            unsigned int size = 0;

            Test("Test7", vecNumbers, size, vecExpected);
        }

        // &#x6ED1;&#x52A8;&#x7A97;&#x53E3;&#x7684;&#x5927;&#x5C0F;&#x5927;&#x4E8E;&#x8F93;&#x5165;&#x6570;&#x7EC4;&#x7684;&#x957F;&#x5EA6;
        void Test8()
        {
            int num[] = { 10, 14, 12, 11 };
            vector<int> vecNumbers(num, num + sizeof(num) / sizeof(int));

            vector<int> vecExpected;

            unsigned int size = 5;

            Test("Test8", vecNumbers, size, vecExpected);
        }

        // &#x8F93;&#x5165;&#x6570;&#x7EC4;&#x4E3A;&#x7A7A;
        void Test9()
        {
            vector<int> vecNumbers;
            vector<int> vecExpected;

            unsigned int size = 5;

            Test("Test9", vecNumbers, size, vecExpected);
        }

        int main(int argc, char* argv[])
        {
            Test1();
            Test2();
            Test3();
            Test4();
            Test5();
            Test6();
            Test7();
            Test8();
            Test9();

            return 0;
        }
</int></int></int></int></int></int></int></int></int></int></int></int></int></int></int></int></int></int></int></int></int></int></=></int></int></int></int></deque></vector></cstdio>
        /*******************************************************************
        Copyright(c) 2016, Harry He
        All rights reserved.

        Distributed under the BSD license.
        (See accompanying file LICENSE.txt at
        https://github.com/zhedahht/CodingInterviewChinese2/blob/master/LICENSE.txt)
        *******************************************************************/

        //==================================================================
        // &#x300A;&#x5251;&#x6307;Offer&#x2014;&#x2014;&#x540D;&#x4F01;&#x9762;&#x8BD5;&#x5B98;&#x7CBE;&#x8BB2;&#x5178;&#x578B;&#x7F16;&#x7A0B;&#x9898;&#x300B;&#x4EE3;&#x7801;
        // &#x4F5C;&#x8005;&#xFF1A;&#x4F55;&#x6D77;&#x6D9B;
        //==================================================================

        // &#x9762;&#x8BD5;&#x9898;59&#xFF08;&#x4E8C;&#xFF09;&#xFF1A;&#x961F;&#x5217;&#x7684;&#x6700;&#x5927;&#x503C;
        // &#x9898;&#x76EE;&#xFF1A;&#x7ED9;&#x5B9A;&#x4E00;&#x4E2A;&#x6570;&#x7EC4;&#x548C;&#x6ED1;&#x52A8;&#x7A97;&#x53E3;&#x7684;&#x5927;&#x5C0F;&#xFF0C;&#x8BF7;&#x627E;&#x51FA;&#x6240;&#x6709;&#x6ED1;&#x52A8;&#x7A97;&#x53E3;&#x91CC;&#x7684;&#x6700;&#x5927;&#x503C;&#x3002;&#x4F8B;&#x5982;&#xFF0C;
        // &#x5982;&#x679C;&#x8F93;&#x5165;&#x6570;&#x7EC4;{2, 3, 4, 2, 6, 2, 5, 1}&#x53CA;&#x6ED1;&#x52A8;&#x7A97;&#x53E3;&#x7684;&#x5927;&#x5C0F;3&#xFF0C;&#x90A3;&#x4E48;&#x4E00;&#x5171;&#x5B58;&#x5728;6&#x4E2A;
        // &#x6ED1;&#x52A8;&#x7A97;&#x53E3;&#xFF0C;&#x5B83;&#x4EEC;&#x7684;&#x6700;&#x5927;&#x503C;&#x5206;&#x522B;&#x4E3A;{4, 4, 6, 6, 6, 5}&#xFF0C;

        #include <cstdio>
        #include <deque>
        #include <exception>

        using namespace std;

        template<typename t> class QueueWithMax
        {
        public:
            QueueWithMax() : currentIndex(0)
            {
            }

            void push_back(T number)
            {
                while(!maximums.empty() && number >= maximums.back().number)
                    maximums.pop_back();

                InternalData internalData = { number, currentIndex };
                data.push_back(internalData);
                maximums.push_back(internalData);

                ++currentIndex;
            }

            void pop_front()
            {
                if(maximums.empty())
                    throw new exception("queue is empty");

                if(maximums.front().index == data.front().index)
                    maximums.pop_front();

                data.pop_front();
            }

            T max() const
            {
                if(maximums.empty())
                    throw new exception("queue is empty");

                return maximums.front().number;
            }

        private:
            struct InternalData
            {
                T number;
                int index;
            };

            deque<internaldata> data;
            deque<internaldata> maximums;
            int currentIndex;
        };

        // ====================&#x6D4B;&#x8BD5;&#x4EE3;&#x7801;====================
        void Test(const char* testName, const QueueWithMax<int>& queue, int expected)
        {
            if(testName != nullptr)
                printf("%s begins: ", testName);

            if(queue.max() == expected)
                printf("Passed.\n");
            else
                printf("FAILED.\n");
        }

        int main(int argc, char* argv[])
        {
            QueueWithMax<int> queue;
            // {2}
            queue.push_back(2);
            Test("Test1", queue, 2);

            // {2, 3}
            queue.push_back(3);
            Test("Test2", queue, 3);

            // {2, 3, 4}
            queue.push_back(4);
            Test("Test3", queue, 4);

            // {2, 3, 4, 2}
            queue.push_back(2);
            Test("Test4", queue, 4);

            // {3, 4, 2}
            queue.pop_front();
            Test("Test5", queue, 4);

            // {4, 2}
            queue.pop_front();
            Test("Test6", queue, 4);

            // {2}
            queue.pop_front();
            Test("Test7", queue, 2);

            // {2, 6}
            queue.push_back(6);
            Test("Test8", queue, 6);

            // {2, 6, 2}
            queue.push_back(2);
            Test("Test9", queue, 6);

            // {2, 6, 2, 5}
            queue.push_back(5);
            Test("Test9", queue, 6);

            // {6, 2, 5}
            queue.pop_front();
            Test("Test10", queue, 6);

            // {2, 5}
            queue.pop_front();
            Test("Test11", queue, 5);

            // {5}
            queue.pop_front();
            Test("Test12", queue, 5);

            // {5, 1}
            queue.push_back(1);
            Test("Test13", queue, 5);

            return 0;
        }
</int></int></internaldata></internaldata></typename></exception></deque></cstdio>

60. 面试题60:n个骰子的点数

        /*******************************************************************
        Copyright(c) 2016, Harry He
        All rights reserved.

        Distributed under the BSD license.
        (See accompanying file LICENSE.txt at
        https://github.com/zhedahht/CodingInterviewChinese2/blob/master/LICENSE.txt)
        *******************************************************************/

        //==================================================================
        // &#x300A;&#x5251;&#x6307;Offer&#x2014;&#x2014;&#x540D;&#x4F01;&#x9762;&#x8BD5;&#x5B98;&#x7CBE;&#x8BB2;&#x5178;&#x578B;&#x7F16;&#x7A0B;&#x9898;&#x300B;&#x4EE3;&#x7801;
        // &#x4F5C;&#x8005;&#xFF1A;&#x4F55;&#x6D77;&#x6D9B;
        //==================================================================

        // &#x9762;&#x8BD5;&#x9898;60&#xFF1A;n&#x4E2A;&#x9AB0;&#x5B50;&#x7684;&#x70B9;&#x6570;
        // &#x9898;&#x76EE;&#xFF1A;&#x628A;n&#x4E2A;&#x9AB0;&#x5B50;&#x6254;&#x5728;&#x5730;&#x4E0A;&#xFF0C;&#x6240;&#x6709;&#x9AB0;&#x5B50;&#x671D;&#x4E0A;&#x4E00;&#x9762;&#x7684;&#x70B9;&#x6570;&#x4E4B;&#x548C;&#x4E3A;s&#x3002;&#x8F93;&#x5165;n&#xFF0C;&#x6253;&#x5370;&#x51FA;s
        // &#x7684;&#x6240;&#x6709;&#x53EF;&#x80FD;&#x7684;&#x503C;&#x51FA;&#x73B0;&#x7684;&#x6982;&#x7387;&#x3002;

        #include <cstdio>
        #include <math.h>

        int g_maxValue = 6;

        // ====================&#x65B9;&#x6CD5;&#x4E00;====================
        void Probability(int number, int* pProbabilities);
        void Probability(int original, int current, int sum, int* pProbabilities);

        void PrintProbability_Solution1(int number)
        {
            if(number < 1)
                return;

            int maxSum = number * g_maxValue;
            int* pProbabilities = new int[maxSum - number + 1];
            for(int i = number; i <= maxsum; ++i) pprobabilities[i - number]="0;" probability(number, pprobabilities); int total="pow((double)g_maxValue," number); for(int i="number;" <="maxSum;" { double ratio="(double)pProbabilities[i" total; printf("%d: %e\n", i, ratio); } delete[] pprobabilities; void probability(int number, int* pprobabilities) original, current, sum, if(current="=" 1) pprobabilities[sum original]++; else probability(original, current 1, + =="==================&#x65B9;&#x6CD5;&#x4E8C;====================" printprobability_solution2(int number) if(number return; pprobabilities[2]; pprobabilities[0]="new" int[g_maxvalue * number 1]; pprobabilities[1]="new" g_maxvalue 1; pprobabilities[0][i]="0;" pprobabilities[1][i]="0;" flag="0;" for (int pprobabilities[flag][i]="1;" k="2;" ++k) k; pprobabilities[1 flag][i]="0;" j="1;" && ++j) j]; flag; number; pprobabilities[0]; pprobabilities[1]; test(int n) printf("test %d begins:\n", n); solution1\n"); printprobability_solution1(n); solution2\n"); printprobability_solution2(n); printf("\n"); main(int argc, char* argv[]) test(1); test(2); test(3); test(4); test(11); test(0); return 0; code></=></math.h></cstdio>

61. 面试题61:扑克牌的顺子

        /*******************************************************************
        Copyright(c) 2016, Harry He
        All rights reserved.

        Distributed under the BSD license.
        (See accompanying file LICENSE.txt at
        https://github.com/zhedahht/CodingInterviewChinese2/blob/master/LICENSE.txt)
        *******************************************************************/

        //==================================================================
        // &#x300A;&#x5251;&#x6307;Offer&#x2014;&#x2014;&#x540D;&#x4F01;&#x9762;&#x8BD5;&#x5B98;&#x7CBE;&#x8BB2;&#x5178;&#x578B;&#x7F16;&#x7A0B;&#x9898;&#x300B;&#x4EE3;&#x7801;
        // &#x4F5C;&#x8005;&#xFF1A;&#x4F55;&#x6D77;&#x6D9B;
        //==================================================================

        // &#x9762;&#x8BD5;&#x9898;61&#xFF1A;&#x6251;&#x514B;&#x724C;&#x7684;&#x987A;&#x5B50;
        // &#x9898;&#x76EE;&#xFF1A;&#x4ECE;&#x6251;&#x514B;&#x724C;&#x4E2D;&#x968F;&#x673A;&#x62BD;5&#x5F20;&#x724C;&#xFF0C;&#x5224;&#x65AD;&#x662F;&#x4E0D;&#x662F;&#x4E00;&#x4E2A;&#x987A;&#x5B50;&#xFF0C;&#x5373;&#x8FD9;5&#x5F20;&#x724C;&#x662F;&#x4E0D;&#x662F;&#x8FDE;&#x7EED;&#x7684;&#x3002;
        // 2&#xFF5E;10&#x4E3A;&#x6570;&#x5B57;&#x672C;&#x8EAB;&#xFF0C;A&#x4E3A;1&#xFF0C;J&#x4E3A;11&#xFF0C;Q&#x4E3A;12&#xFF0C;K&#x4E3A;13&#xFF0C;&#x800C;&#x5927;&#x3001;&#x5C0F;&#x738B;&#x53EF;&#x4EE5;&#x770B;&#x6210;&#x4EFB;&#x610F;&#x6570;&#x5B57;&#x3002;

        #include <cstdio>
        #include <cstdlib>

        int Compare(const void *arg1, const void *arg2);

        bool IsContinuous(int* numbers, int length)
        {
            if(numbers == nullptr || length < 1)
                return false;

            qsort(numbers, length, sizeof(int), Compare);

            int numberOfZero = 0;
            int numberOfGap = 0;

            // &#x7EDF;&#x8BA1;&#x6570;&#x7EC4;&#x4E2D;0&#x7684;&#x4E2A;&#x6570;
            for(int i = 0; i < length && numbers[i] == 0; ++i)
                ++numberOfZero;

            // &#x7EDF;&#x8BA1;&#x6570;&#x7EC4;&#x4E2D;&#x7684;&#x95F4;&#x9694;&#x6570;&#x76EE;
            int small = numberOfZero;
            int big = small + 1;
            while(big < length)
            {
                // &#x4E24;&#x4E2A;&#x6570;&#x76F8;&#x7B49;&#xFF0C;&#x6709;&#x5BF9;&#x5B50;&#xFF0C;&#x4E0D;&#x53EF;&#x80FD;&#x662F;&#x987A;&#x5B50;
                if(numbers[small] == numbers[big])
                    return false;

                numberOfGap += numbers[big] - numbers[small] - 1;
                small = big;
                ++big;
            }

            return (numberOfGap > numberOfZero) ? false : true;
        }

        int Compare(const void *arg1, const void *arg2)
        {
            return *(int*) arg1 - *(int*) arg2;
        }

        // ====================&#x6D4B;&#x8BD5;&#x4EE3;&#x7801;====================
        void Test(const char* testName, int* numbers, int length, bool expected)
        {
            if(testName != nullptr)
                printf("%s begins: ", testName);

            if(IsContinuous(numbers, length) == expected)
                printf("Passed.\n");
            else
                printf("Failed.\n");
        }

        void Test1()
        {
            int numbers[] = { 1, 3, 2, 5, 4 };
            Test("Test1", numbers, sizeof(numbers) / sizeof(int), true);
        }

        void Test2()
        {
            int numbers[] = { 1, 3, 2, 6, 4 };
            Test("Test2", numbers, sizeof(numbers) / sizeof(int), false);
        }

        void Test3()
        {
            int numbers[] = { 0, 3, 2, 6, 4 };
            Test("Test3", numbers, sizeof(numbers) / sizeof(int), true);
        }

        void Test4()
        {
            int numbers[] = { 0, 3, 1, 6, 4 };
            Test("Test4", numbers, sizeof(numbers) / sizeof(int), false);
        }

        void Test5()
        {
            int numbers[] = { 1, 3, 0, 5, 0 };
            Test("Test5", numbers, sizeof(numbers) / sizeof(int), true);
        }

        void Test6()
        {
            int numbers[] = { 1, 3, 0, 7, 0 };
            Test("Test6", numbers, sizeof(numbers) / sizeof(int), false);
        }

        void Test7()
        {
            int numbers[] = { 1, 0, 0, 5, 0 };
            Test("Test7", numbers, sizeof(numbers) / sizeof(int), true);
        }
</cstdlib></cstdio>

62. 面试题62:圆圈中最后剩下的数字

        /*******************************************************************
        Copyright(c) 2016, Harry He
        All rights reserved.

        Distributed under the BSD license.
        (See accompanying file LICENSE.txt at
        https://github.com/zhedahht/CodingInterviewChinese2/blob/master/LICENSE.txt)
        *******************************************************************/

        //==================================================================
        // &#x300A;&#x5251;&#x6307;Offer&#x2014;&#x2014;&#x540D;&#x4F01;&#x9762;&#x8BD5;&#x5B98;&#x7CBE;&#x8BB2;&#x5178;&#x578B;&#x7F16;&#x7A0B;&#x9898;&#x300B;&#x4EE3;&#x7801;
        // &#x4F5C;&#x8005;&#xFF1A;&#x4F55;&#x6D77;&#x6D9B;
        //==================================================================

        // &#x9762;&#x8BD5;&#x9898;62&#xFF1A;&#x5706;&#x5708;&#x4E2D;&#x6700;&#x540E;&#x5269;&#x4E0B;&#x7684;&#x6570;&#x5B57;
        // &#x9898;&#x76EE;&#xFF1A;0, 1, &#x2026;, n-1&#x8FD9;n&#x4E2A;&#x6570;&#x5B57;&#x6392;&#x6210;&#x4E00;&#x4E2A;&#x5706;&#x5708;&#xFF0C;&#x4ECE;&#x6570;&#x5B57;0&#x5F00;&#x59CB;&#x6BCF;&#x6B21;&#x4ECE;&#x8FD9;&#x4E2A;&#x5706;&#x5708;&#x91CC;
        // &#x5220;&#x9664;&#x7B2C;m&#x4E2A;&#x6570;&#x5B57;&#x3002;&#x6C42;&#x51FA;&#x8FD9;&#x4E2A;&#x5706;&#x5708;&#x91CC;&#x5269;&#x4E0B;&#x7684;&#x6700;&#x540E;&#x4E00;&#x4E2A;&#x6570;&#x5B57;&#x3002;

        #include <cstdio>
        #include <list>

        using namespace std;

        // ====================&#x65B9;&#x6CD5;1====================
        int LastRemaining_Solution1(unsigned int n, unsigned int m)
        {
            if(n < 1 || m < 1)
                return -1;

            unsigned int i = 0;

            list<int> numbers;
            for(i = 0; i < n; ++ i)
                numbers.push_back(i);

            list<int>::iterator current = numbers.begin();
            while(numbers.size() > 1)
            {
                for(int i = 1; i < m; ++ i)
                {
                    current ++;
                    if(current == numbers.end())
                        current = numbers.begin();
                }

                list<int>::iterator next = ++ current;
                if(next == numbers.end())
                    next = numbers.begin();

                -- current;
                numbers.erase(current);
                current = next;
            }

            return *(current);
        }

        // ====================&#x65B9;&#x6CD5;2====================
        int LastRemaining_Solution2(unsigned int n, unsigned int m)
        {
            if(n < 1 || m < 1)
                return -1;

            int last = 0;
            for (int i = 2; i <= n; i ++) last="(last" + m) % i; return last; } =="==================&#x6D4B;&#x8BD5;&#x4EE3;&#x7801;====================" void test(const char* testname, unsigned int n, m, expected) { if(testname !="nullptr)" printf("%s begins: \n", testname); if(lastremaining_solution1(n, printf("solution1 passed.\n"); else failed.\n"); if(lastremaining_solution2(n, printf("solution2 printf("\n"); test1() test("test1", 5, 3, 3); test2() test("test2", 2, 2); test3() test("test3", 6, 7, 4); test4() test("test4", test5() test("test5", 0, -1); test6() test("test6", 4000, 997, 1027); main(int argc, argv[]) test1(); test2(); test3(); test4(); test5(); test6(); 0; < code></=></int></int></int></list></cstdio>

66. 面试题66:构建乘积数组

        /*******************************************************************
        Copyright(c) 2016, Harry He
        All rights reserved.

        Distributed under the BSD license.
        (See accompanying file LICENSE.txt at
        https://github.com/zhedahht/CodingInterviewChinese2/blob/master/LICENSE.txt)
        *******************************************************************/

        //==================================================================
        // &#x300A;&#x5251;&#x6307;Offer&#x2014;&#x2014;&#x540D;&#x4F01;&#x9762;&#x8BD5;&#x5B98;&#x7CBE;&#x8BB2;&#x5178;&#x578B;&#x7F16;&#x7A0B;&#x9898;&#x300B;&#x4EE3;&#x7801;
        // &#x4F5C;&#x8005;&#xFF1A;&#x4F55;&#x6D77;&#x6D9B;
        //==================================================================

        // &#x9762;&#x8BD5;&#x9898;66&#xFF1A;&#x6784;&#x5EFA;&#x4E58;&#x79EF;&#x6570;&#x7EC4;
        // &#x9898;&#x76EE;&#xFF1A;&#x7ED9;&#x5B9A;&#x4E00;&#x4E2A;&#x6570;&#x7EC4;A[0, 1, &#x2026;, n-1]&#xFF0C;&#x8BF7;&#x6784;&#x5EFA;&#x4E00;&#x4E2A;&#x6570;&#x7EC4;B[0, 1, &#x2026;, n-1]&#xFF0C;&#x5176;
        // &#x4E2D;B&#x4E2D;&#x7684;&#x5143;&#x7D20;B[i] =A[0]&#xD7;A[1]&#xD7;&#x2026; &#xD7;A[i-1]&#xD7;A[i+1]&#xD7;&#x2026;&#xD7;A[n-1]&#x3002;&#x4E0D;&#x80FD;&#x4F7F;&#x7528;&#x9664;&#x6CD5;&#x3002;

        #include <cstdio>
        #include <vector>

        using namespace std;

        void BuildProductionArray(const vector<double>& input, vector<double>& output)
        {
            int length1 = input.size();
            int length2 = output.size();

            if(length1 == length2 && length2 > 1)
            {
                output[0] = 1;
                for(int i = 1; i < length1; ++i)
                {
                    output[i] = output[i - 1] * input[i - 1];
                }

                double temp = 1;
                for(int i = length1 - 2; i >= 0; --i)
                {
                    temp *= input[i + 1];
                    output[i] *= temp;
                }
            }
        }

        //================= Test Code =================
        static bool EqualArrays(const vector<double>& input, const vector<double>& output)
        {
            int length1 = input.size();
            int length2 = output.size();

            if(length1 != length2)
                return false;

            for(int i = 0; i < length1; ++i)
            {
                if(abs(input[i] - output[i]) > 0.0000001)
                    return false;
            }

            return true;
        }

        static void test(char* testName, const vector<double>& input, vector<double>& output, const vector<double>& expected)
        {
            printf("%s Begins: ", testName);

            BuildProductionArray(input, output);
            if(EqualArrays(output, expected))
                printf("Passed.\n");
            else
                printf("FAILED.\n");
        }

        static void test1()
        {
            // &#x8F93;&#x5165;&#x6570;&#x7EC4;&#x4E2D;&#x6CA1;&#x6709;0
            double input[] = { 1, 2, 3, 4, 5 };
            double output[] = { 0, 0, 0, 0, 0 };
            double expected[] = { 120, 60, 40, 30, 24 };

            test("Test1", vector<double>(input, input + sizeof(input) / sizeof(double)),
                vector<double>(output, output + sizeof(output) / sizeof(double)),
                vector<double>(expected, expected + sizeof(expected) / sizeof(double)));
        }

        static void test2()
        {
            // &#x8F93;&#x5165;&#x6570;&#x7EC4;&#x4E2D;&#x6709;&#x4E00;&#x4E2A;0
            double input[] = { 1, 2, 0, 4, 5 };
            double output[] = { 0, 0, 0, 0, 0 };
            double expected[] = { 0, 0, 40, 0, 0 };

            test("Test2", vector<double>(input, input + sizeof(input) / sizeof(double)),
                vector<double>(output, output + sizeof(output) / sizeof(double)),
                vector<double>(expected, expected + sizeof(expected) / sizeof(double)));
        }

        static void test3()
        {
            // &#x8F93;&#x5165;&#x6570;&#x7EC4;&#x4E2D;&#x6709;&#x4E24;&#x4E2A;0
            double input[] = { 1, 2, 0, 4, 0 };
            double output[] = { 0, 0, 0, 0, 0 };
            double expected[] = { 0, 0, 0, 0, 0 };

            test("Test3", vector<double>(input, input + sizeof(input) / sizeof(double)),
                vector<double>(output, output + sizeof(output) / sizeof(double)),
                vector<double>(expected, expected + sizeof(expected) / sizeof(double)));
        }

        static void test4()
        {
            // &#x8F93;&#x5165;&#x6570;&#x7EC4;&#x4E2D;&#x6709;&#x6B63;&#x3001;&#x8D1F;&#x6570;
            double input[] = { 1, -2, 3, -4, 5 };
            double output[] = { 0, 0, 0, 0, 0 };
            double expected[] = { 120, -60, 40, -30, 24 };

            test("Test4", vector<double>(input, input + sizeof(input) / sizeof(double)),
                vector<double>(output, output + sizeof(output) / sizeof(double)),
                vector<double>(expected, expected + sizeof(expected) / sizeof(double)));
        }

        static void test5()
        {
            // &#x8F93;&#x5165;&#x8F93;&#x5165;&#x4E2D;&#x53EA;&#x6709;&#x4E24;&#x4E2A;&#x6570;&#x5B57;
            double input[] = { 1, -2 };
            double output[] = { 0, 0 };
            double expected[] = { -2, 1 };

            test("Test5", vector<double>(input, input + sizeof(input) / sizeof(double)),
                vector<double>(output, output + sizeof(output) / sizeof(double)),
                vector<double>(expected, expected + sizeof(expected) / sizeof(double)));
        }

        int main(int argc, char* argv[])
        {
            test1();
            test2();
            test3();
            test4();
            test5();

            return 0;
        }
</double></double></double></double></double></double></double></double></double></double></double></double></double></double></double></double></double></double></double></double></double></double></vector></cstdio>

Original: https://www.cnblogs.com/agui125/p/12024887.html
Author: 风御之举
Title: 数字数组

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/644392/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球