其他

1、【剑指Offer学习】【面试题01:实现赋值运算符函数】

2、【剑指Offer学习】【面试题02:实现Singleton 模式——七种实现方式】

5、【剑指Offer学习】【面试题05:替换空格】

10、【剑指Offer学习】【面试题10:斐波那契数列】

12、【剑指Offer学习】【面试题12:二进制中1 的个数】

13、【剑指Offer学习】【面试题13:机器人的运动范围】

14、【剑指Offer学习】【面试题14:剪绳子】

15、【剑指Offer学习】【面试题15:二进制中1的个数】

17、【剑指Offer学习】【面试题17:打印1到最大的n位数】

19、【剑指Offer学习】【面试题19:正则表达式匹配】

29、【剑指Offer学习】【面试题29:顺时针打印矩阵】

40、【剑指Offer学习】【面试题40:最小的k个数】

41、【剑指Offer学习】【面试题41:数据流中的中位数】

47、【剑指Offer学习】【面试题47:礼物的最大价值】

49、【剑指Offer学习】【面试题49:丑数】

58、【剑指Offer学习】【面试题58:翻转单词顺序】

59、【剑指Offer学习】【面试题59:滑动窗口的最大值】

60、【剑指Offer学习】【面试题60:n个骰子的点数】

61、【剑指Offer学习】【面试题61:扑克牌的顺子】

63、【剑指Offer学习】【面试题63:股票的最大利润】

64、【剑指Offer学习】【面试题64:求1+2+…+n】

65、【剑指Offer学习】【面试题65:不用加减乘除做加法】

68、【剑指Offer学习】【面试题68:树中两个结点的最低公共祖先】

1. 面试题01:实现赋值运算符函数

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

    // 面试题1:赋值运算符函数
    // 题目:如下为类型CMyString的声明,请为该类型添加赋值运算符函数。

    #include<cstring>
    #include<cstdio>

    class CMyString
    {
    public:
        CMyString(char* pData = nullptr);
        CMyString(const CMyString& str);
        ~CMyString(void);

        CMyString& operator = (const CMyString& str);

        void Print();

    private:
        char* m_pData;
    };

    CMyString::CMyString(char *pData)
    {
        if(pData == nullptr)
        {
            m_pData = new char[1];
            m_pData[0] = '\0';
        }
        else
        {
            int length = strlen(pData);
            m_pData = new char[length + 1];
            strcpy(m_pData, pData);
        }
    }

    CMyString::CMyString(const CMyString &str)
    {
        int length = strlen(str.m_pData);
        m_pData = new char[length + 1];
        strcpy(m_pData, str.m_pData);
    }

    CMyString::~CMyString()
    {
        delete[] m_pData;
    }

    CMyString& CMyString::operator = (const CMyString& str)
    {
        if(this == &str)
            return *this;

        delete []m_pData;
        m_pData = nullptr;

        m_pData = new char[strlen(str.m_pData) + 1];
        strcpy(m_pData, str.m_pData);

        return *this;
    }

    // ====================&#x6D4B;&#x8BD5;&#x4EE3;&#x7801;====================
    void CMyString::Print()
    {
        printf("%s", m_pData);
    }

    void Test1()
    {
        printf("Test1 begins:\n");

        char* text = "Hello world";

        CMyString str1(text);
        CMyString str2;
        str2 = str1;

        printf("The expected result is: %s.\n", text);

        printf("The actual result is: ");
        str2.Print();
        printf(".\n");
    }

    // &#x8D4B;&#x503C;&#x7ED9;&#x81EA;&#x5DF1;
    void Test2()
    {
        printf("Test2 begins:\n");

        char* text = "Hello world";

        CMyString str1(text);
        str1 = str1;

        printf("The expected result is: %s.\n", text);

        printf("The actual result is: ");
        str1.Print();
        printf(".\n");
    }

    // &#x8FDE;&#x7EED;&#x8D4B;&#x503C;
    void Test3()
    {
        printf("Test3 begins:\n");

        char* text = "Hello world";

        CMyString str1(text);
        CMyString str2, str3;
        str3 = str2 = str1;

        printf("The expected result is: %s.\n", text);

        printf("The actual result is: ");
        str2.Print();
        printf(".\n");

        printf("The expected result is: %s.\n", text);

        printf("The actual result is: ");
        str3.Print();
        printf(".\n");
    }

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

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

2. 面试题02:实现Singleton 模式——七种实现方式

    /*******************************************************************
    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;2&#xFF1A;&#x5B9E;&#x73B0;Singleton&#x6A21;&#x5F0F;
    // &#x9898;&#x76EE;&#xFF1A;&#x8BBE;&#x8BA1;&#x4E00;&#x4E2A;&#x7C7B;&#xFF0C;&#x6211;&#x4EEC;&#x53EA;&#x80FD;&#x751F;&#x6210;&#x8BE5;&#x7C7B;&#x7684;&#x4E00;&#x4E2A;&#x5B9E;&#x4F8B;&#x3002;

    using System;

    namespace _02_Singleton
    {
        public sealed class Singleton1
        {
            private Singleton1()
            {
            }

            private static Singleton1 instance = null;
            public static Singleton1 Instance
            {
                get
                {
                    if (instance == null)
                        instance = new Singleton1();

                    return instance;
                }
            }
        }

        public sealed class Singleton2
        {
            private Singleton2()
            {
            }

            private static readonly object syncObj = new object();

            private static Singleton2 instance = null;
            public static Singleton2 Instance
            {
                get
                {
                    lock (syncObj)
                    {
                        if (instance == null)
                            instance = new Singleton2();
                    }

                    return instance;
                }
            }
        }

        public sealed class Singleton3
        {
            private Singleton3()
            {
            }

            private static object syncObj = new object();

            private static Singleton3 instance = null;
            public static Singleton3 Instance
            {
                get
                {
                    if (instance == null)
                    {
                        lock (syncObj)
                        {
                            if (instance == null)
                                instance = new Singleton3();
                        }
                    }

                    return instance;
                }
            }
        }

        public sealed class Singleton4
        {
            private Singleton4()
            {
                Console.WriteLine("An instance of Singleton4 is created.");
            }

            public static void Print()
            {
                Console.WriteLine("Singleton4 Print");
            }

            private static Singleton4 instance = new Singleton4();
            public static Singleton4 Instance
            {
                get
                {
                    return instance;
                }
            }
        }

        public sealed class Singleton5
        {
            Singleton5()
            {
                Console.WriteLine("An instance of Singleton5 is created.");
            }

            public static void Print()
            {
                Console.WriteLine("Singleton5 Print");
            }

            public static Singleton5 Instance
            {
                get
                {
                    return Nested.instance;
                }
            }

            class Nested
            {
                static Nested()
                {
                }

                internal static readonly Singleton5 instance = new Singleton5();
            }
        }

        class Program
        {
            static void Main(string[] args)
            {
                // &#x4E5F;&#x4F1A;&#x6253;&#x5370;An instance of Singleton4 is created.
                Singleton4.Print();

                // &#x4E0D;&#x4F1A;&#x6253;&#x5370;An instance of Singleton5 is created.
                Singleton5.Print();
            }
        }
    }

5. 【剑指Offer学习】【面试题05:替换空格】】

        /*******************************************************************
        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;5&#xFF1A;&#x66FF;&#x6362;&#x7A7A;&#x683C;
        // &#x9898;&#x76EE;&#xFF1A;&#x8BF7;&#x5B9E;&#x73B0;&#x4E00;&#x4E2A;&#x51FD;&#x6570;&#xFF0C;&#x628A;&#x5B57;&#x7B26;&#x4E32;&#x4E2D;&#x7684;&#x6BCF;&#x4E2A;&#x7A7A;&#x683C;&#x66FF;&#x6362;&#x6210;"%20"&#x3002;&#x4F8B;&#x5982;&#x8F93;&#x5165;&#x201C;We are happy.&#x201D;&#xFF0C;
        // &#x5219;&#x8F93;&#x51FA;&#x201C;We%20are%20happy.&#x201D;&#x3002;

        #include <cstdio>
        #include <cstring>

        /*length &#x4E3A;&#x5B57;&#x7B26;&#x6570;&#x7EC4;str&#x7684;&#x603B;&#x5BB9;&#x91CF;&#xFF0C;&#x5927;&#x4E8E;&#x6216;&#x7B49;&#x4E8E;&#x5B57;&#x7B26;&#x4E32;str&#x7684;&#x5B9E;&#x9645;&#x957F;&#x5EA6;*/
        void ReplaceBlank(char str[], int length)
        {
            if(str == nullptr && length <= 0) return; *originallength 为字符串str的实际长度* int originallength="0;" numberofblank="0;" i="0;" while(str[i] !="\0" ) { ++ originallength; if(str[i]="=" ' ') numberofblank; i; } *newlength 为把空格替换成'%20'之后的长度* newlength="originalLength" + * 2; if(newlength> length)
                return;

            int indexOfOriginal = originalLength;
            int indexOfNew = newLength;
            while(indexOfOriginal >= 0 && indexOfNew > indexOfOriginal)
            {
                if(str[indexOfOriginal] == ' ')
                {
                    str[indexOfNew --] = '0';
                    str[indexOfNew --] = '2';
                    str[indexOfNew --] = '%';
                }
                else
                {
                    str[indexOfNew --] = str[indexOfOriginal];
                }

                -- indexOfOriginal;
            }
        }

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

            ReplaceBlank(str, length);

            if(expected == nullptr && str == nullptr)
                printf("passed.\n");
            else if(expected == nullptr && str != nullptr)
                printf("failed.\n");
            else if(strcmp(str, expected) == 0)
                printf("passed.\n");
            else
                printf("failed.\n");
        }

        // &#x7A7A;&#x683C;&#x5728;&#x53E5;&#x5B50;&#x4E2D;&#x95F4;
        void Test1()
        {
            const int length = 100;

            char str[length] = "hello world";
            Test("Test1", str, length, "hello%20world");
        }

        // &#x7A7A;&#x683C;&#x5728;&#x53E5;&#x5B50;&#x5F00;&#x5934;
        void Test2()
        {
            const int length = 100;

            char str[length] = " helloworld";
            Test("Test2", str, length, "%20helloworld");
        }

        // &#x7A7A;&#x683C;&#x5728;&#x53E5;&#x5B50;&#x672B;&#x5C3E;
        void Test3()
        {
            const int length = 100;

            char str[length] = "helloworld ";
            Test("Test3", str, length, "helloworld%20");
        }

        // &#x8FDE;&#x7EED;&#x6709;&#x4E24;&#x4E2A;&#x7A7A;&#x683C;
        void Test4()
        {
            const int length = 100;

            char str[length] = "hello  world";
            Test("Test4", str, length, "hello%20%20world");
        }

        // &#x4F20;&#x5165;nullptr
        void Test5()
        {
            Test("Test5", nullptr, 0, nullptr);
        }

        // &#x4F20;&#x5165;&#x5185;&#x5BB9;&#x4E3A;&#x7A7A;&#x7684;&#x5B57;&#x7B26;&#x4E32;
        void Test6()
        {
            const int length = 100;

            char str[length] = "";
            Test("Test6", str, length, "");
        }

        //&#x4F20;&#x5165;&#x5185;&#x5BB9;&#x4E3A;&#x4E00;&#x4E2A;&#x7A7A;&#x683C;&#x7684;&#x5B57;&#x7B26;&#x4E32;
        void Test7()
        {
            const int length = 100;

            char str[length] = " ";
            Test("Test7", str, length, "%20");
        }

        // &#x4F20;&#x5165;&#x7684;&#x5B57;&#x7B26;&#x4E32;&#x6CA1;&#x6709;&#x7A7A;&#x683C;
        void Test8()
        {
            const int length = 100;

            char str[length] = "helloworld";
            Test("Test8", str, length, "helloworld");
        }

        // &#x4F20;&#x5165;&#x7684;&#x5B57;&#x7B26;&#x4E32;&#x5168;&#x662F;&#x7A7A;&#x683C;
        void Test9()
        {
            const int length = 100;

            char str[length] = "   ";
            Test("Test9", str, length, "%20%20%20");
        }

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

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

10. 【剑指Offer学习】【面试题10:斐波那契数列】

/************* 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;10&#xFF1A;&#x6590;&#x6CE2;&#x90A3;&#x5951;&#x6570;&#x5217;
            // &#x9898;&#x76EE;&#xFF1A;&#x5199;&#x4E00;&#x4E2A;&#x51FD;&#x6570;&#xFF0C;&#x8F93;&#x5165;n&#xFF0C;&#x6C42;&#x6590;&#x6CE2;&#x90A3;&#x5951;&#xFF08;Fibonacci&#xFF09;&#x6570;&#x5217;&#x7684;&#x7B2C;n&#x9879;&#x3002;

            #include <cstdio>

            // ====================&#x65B9;&#x6CD5;1&#xFF1A;&#x9012;&#x5F52;====================
            long long Fibonacci_Solution1(unsigned int n)
            {
                if(n <= 0) return 0; if(n="=" 1) 1; fibonacci_solution1(n - + 2); } =="==================&#x65B9;&#x6CD5;2&#xFF1A;&#x5FAA;&#x73AF;====================" long fibonacci_solution2(unsigned n) { int result[2]="{0," 1}; < 2) result[n]; fibnminusone="1;" fibnminustwo="0;" fibn="0;" for(unsigned i="2;" ++ i) fibnminustwo; fibn; #include <cassert>

            struct Matrix2By2
            {
                Matrix2By2
                (
                    long long m00 = 0,
                    long long m01 = 0,
                    long long m10 = 0,
                    long long m11 = 0
                )
                :m_00(m00), m_01(m01), m_10(m10), m_11(m11)
                {
                }

                long long m_00;
                long long m_01;
                long long m_10;
                long long m_11;
            };

            Matrix2By2 MatrixMultiply
            (
                const Matrix2By2& matrix1,
                const Matrix2By2& matrix2
            )
            {
                return Matrix2By2(
                    matrix1.m_00 * matrix2.m_00 + matrix1.m_01 * matrix2.m_10,
                    matrix1.m_00 * matrix2.m_01 + matrix1.m_01 * matrix2.m_11,
                    matrix1.m_10 * matrix2.m_00 + matrix1.m_11 * matrix2.m_10,
                    matrix1.m_10 * matrix2.m_01 + matrix1.m_11 * matrix2.m_11);
            }

            Matrix2By2 MatrixPower(unsigned int n)
            {
                assert(n > 0);

                Matrix2By2 matrix;
                if(n == 1)
                {
                    matrix = Matrix2By2(1, 1, 1, 0);
                }
                else if(n % 2 == 0)
                {
                    matrix = MatrixPower(n / 2);
                    matrix = MatrixMultiply(matrix, matrix);
                }
                else if(n % 2 == 1)
                {
                    matrix = MatrixPower((n - 1) / 2);
                    matrix = MatrixMultiply(matrix, matrix);
                    matrix = MatrixMultiply(matrix, Matrix2By2(1, 1, 1, 0));
                }

                return matrix;
            }

            long long Fibonacci_Solution3(unsigned int n)
            {
                int result[2] = {0, 1};
                if(n < 2)
                    return result[n];

                Matrix2By2 PowerNMinus2 = MatrixPower(n - 1);
                return PowerNMinus2.m_00;
            }

            // ====================&#x6D4B;&#x8BD5;&#x4EE3;&#x7801;====================
            void Test(int n, int expected)
            {
                if(Fibonacci_Solution1(n) == expected)
                    printf("Test for %d in solution1 passed.\n", n);
                else
                    printf("Test for %d in solution1 failed.\n", n);

                if(Fibonacci_Solution2(n) == expected)
                    printf("Test for %d in solution2 passed.\n", n);
                else
                    printf("Test for %d in solution2 failed.\n", n);

                if(Fibonacci_Solution3(n) == expected)
                    printf("Test for %d in solution3 passed.\n", n);
                else
                    printf("Test for %d in solution3 failed.\n", n);
            }

            int main(int argc, char* argv[])
            {
                Test(0, 0);
                Test(1, 1);
                Test(2, 1);
                Test(3, 2);
                Test(4, 3);
                Test(5, 5);
                Test(6, 8);
                Test(7, 13);
                Test(8, 21);
                Test(9, 34);
                Test(10, 55);

                Test(40, 102334155);

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

12. 面试题12:实现赋值运算符函数

/************* 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;12&#xFF1A;&#x77E9;&#x9635;&#x4E2D;&#x7684;&#x8DEF;&#x5F84;
        // &#x9898;&#x76EE;&#xFF1A;&#x8BF7;&#x8BBE;&#x8BA1;&#x4E00;&#x4E2A;&#x51FD;&#x6570;&#xFF0C;&#x7528;&#x6765;&#x5224;&#x65AD;&#x5728;&#x4E00;&#x4E2A;&#x77E9;&#x9635;&#x4E2D;&#x662F;&#x5426;&#x5B58;&#x5728;&#x4E00;&#x6761;&#x5305;&#x542B;&#x67D0;&#x5B57;&#x7B26;&#x4E32;&#x6240;&#x6709;
        // &#x5B57;&#x7B26;&#x7684;&#x8DEF;&#x5F84;&#x3002;&#x8DEF;&#x5F84;&#x53EF;&#x4EE5;&#x4ECE;&#x77E9;&#x9635;&#x4E2D;&#x4EFB;&#x610F;&#x4E00;&#x683C;&#x5F00;&#x59CB;&#xFF0C;&#x6BCF;&#x4E00;&#x6B65;&#x53EF;&#x4EE5;&#x5728;&#x77E9;&#x9635;&#x4E2D;&#x5411;&#x5DE6;&#x3001;&#x53F3;&#x3001;
        // &#x4E0A;&#x3001;&#x4E0B;&#x79FB;&#x52A8;&#x4E00;&#x683C;&#x3002;&#x5982;&#x679C;&#x4E00;&#x6761;&#x8DEF;&#x5F84;&#x7ECF;&#x8FC7;&#x4E86;&#x77E9;&#x9635;&#x7684;&#x67D0;&#x4E00;&#x683C;&#xFF0C;&#x90A3;&#x4E48;&#x8BE5;&#x8DEF;&#x5F84;&#x4E0D;&#x80FD;&#x518D;&#x6B21;&#x8FDB;&#x5165;
        // &#x8BE5;&#x683C;&#x5B50;&#x3002;&#x4F8B;&#x5982;&#x5728;&#x4E0B;&#x9762;&#x7684;3&#xD7;4&#x7684;&#x77E9;&#x9635;&#x4E2D;&#x5305;&#x542B;&#x4E00;&#x6761;&#x5B57;&#x7B26;&#x4E32;&#x201C;bfce&#x201D;&#x7684;&#x8DEF;&#x5F84;&#xFF08;&#x8DEF;&#x5F84;&#x4E2D;&#x7684;&#x5B57;
        // &#x6BCD;&#x7528;&#x4E0B;&#x5212;&#x7EBF;&#x6807;&#x51FA;&#xFF09;&#x3002;&#x4F46;&#x77E9;&#x9635;&#x4E2D;&#x4E0D;&#x5305;&#x542B;&#x5B57;&#x7B26;&#x4E32;&#x201C;abfb&#x201D;&#x7684;&#x8DEF;&#x5F84;&#xFF0C;&#x56E0;&#x4E3A;&#x5B57;&#x7B26;&#x4E32;&#x7684;&#x7B2C;&#x4E00;&#x4E2A;
        // &#x5B57;&#x7B26;b&#x5360;&#x636E;&#x4E86;&#x77E9;&#x9635;&#x4E2D;&#x7684;&#x7B2C;&#x4E00;&#x884C;&#x7B2C;&#x4E8C;&#x4E2A;&#x683C;&#x5B50;&#x4E4B;&#x540E;&#xFF0C;&#x8DEF;&#x5F84;&#x4E0D;&#x80FD;&#x518D;&#x6B21;&#x8FDB;&#x5165;&#x8FD9;&#x4E2A;&#x683C;&#x5B50;&#x3002;
        // A B T G
        // C F C S
        // J D E H

        #include <cstdio>
        #include <string>
        #include <stack>

        using namespace std;

        bool hasPathCore(const char* matrix, int rows, int cols, int row, int col, const char* str, int& pathLength, bool* visited);

        bool hasPath(const char* matrix, int rows, int cols, const char* str)
        {
            if(matrix == nullptr || rows < 1 || cols < 1 || str == nullptr)
                return false;

            bool *visited = new bool[rows * cols];
            memset(visited, 0, rows * cols);

            int pathLength = 0;
            for(int row = 0; row < rows; ++row)
            {
                for(int col = 0; col < cols; ++col)
                {
                    if(hasPathCore(matrix, rows, cols, row, col, str,
                        pathLength, visited))
                    {
                        return true;
                    }
                }
            }

            delete[] visited;

            return false;
        }

        bool hasPathCore(const char* matrix, int rows, int cols, int row,
            int col, const char* str, int& pathLength, bool* visited)
        {
            if(str[pathLength] == '\0')
                return true;

            bool hasPath = false;
            if(row >= 0 && row < rows && col >= 0 && col < cols
                && matrix[row * cols + col] == str[pathLength]
                && !visited[row * cols + col])
            {
                ++pathLength;
                visited[row * cols + col] = true;

                hasPath = hasPathCore(matrix, rows, cols, row, col - 1,
                    str, pathLength, visited)
                    || hasPathCore(matrix, rows, cols, row - 1, col,
                        str, pathLength, visited)
                    || hasPathCore(matrix, rows, cols, row, col + 1,
                        str, pathLength, visited)
                    || hasPathCore(matrix, rows, cols, row + 1, col,
                        str, pathLength, visited);

                if(!hasPath)
                {
                    --pathLength;
                    visited[row * cols + col] = false;
                }
            }

            return hasPath;
        }

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

            if(hasPath(matrix, rows, cols, str) == expected)
                printf("Passed.\n");
            else
                printf("FAILED.\n");
        }

        //ABTG
        //CFCS
        //JDEH

        //BFCE
        void Test1()
        {
            const char* matrix = "ABTGCFCSJDEH";
            const char* str = "BFCE";

            Test("Test1", (const char*) matrix, 3, 4, str, true);
        }

        //ABCE
        //SFCS
        //ADEE

        //SEE
        void Test2()
        {
            const char* matrix = "ABCESFCSADEE";
            const char* str = "SEE";

            Test("Test2", (const char*) matrix, 3, 4, str, true);
        }

        //ABTG
        //CFCS
        //JDEH

        //ABFB
        void Test3()
        {
            const char* matrix = "ABTGCFCSJDEH";
            const char* str = "ABFB";

            Test("Test3", (const char*) matrix, 3, 4, str, false);
        }

        //ABCEHJIG
        //SFCSLOPQ
        //ADEEMNOE
        //ADIDEJFM
        //VCEIFGGS

        //SLHECCEIDEJFGGFIE
        void Test4()
        {
            const char* matrix = "ABCEHJIGSFCSLOPQADEEMNOEADIDEJFMVCEIFGGS";
            const char* str = "SLHECCEIDEJFGGFIE";

            Test("Test4", (const char*) matrix, 5, 8, str, true);
        }

        //ABCEHJIG
        //SFCSLOPQ
        //ADEEMNOE
        //ADIDEJFM
        //VCEIFGGS

        //SGGFIECVAASABCEHJIGQEM
        void Test5()
        {
            const char* matrix = "ABCEHJIGSFCSLOPQADEEMNOEADIDEJFMVCEIFGGS";
            const char* str = "SGGFIECVAASABCEHJIGQEM";

            Test("Test5", (const char*) matrix, 5, 8, str, true);
        }

        //ABCEHJIG
        //SFCSLOPQ
        //ADEEMNOE
        //ADIDEJFM
        //VCEIFGGS

        //SGGFIECVAASABCEEJIGOEM
        void Test6()
        {
            const char* matrix = "ABCEHJIGSFCSLOPQADEEMNOEADIDEJFMVCEIFGGS";
            const char* str = "SGGFIECVAASABCEEJIGOEM";

            Test("Test6", (const char*) matrix, 5, 8, str, false);
        }

        //ABCEHJIG
        //SFCSLOPQ
        //ADEEMNOE
        //ADIDEJFM
        //VCEIFGGS

        //SGGFIECVAASABCEHJIGQEMS
        void Test7()
        {
            const char* matrix = "ABCEHJIGSFCSLOPQADEEMNOEADIDEJFMVCEIFGGS";
            const char* str = "SGGFIECVAASABCEHJIGQEMS";

            Test("Test7", (const char*) matrix, 5, 8, str, false);
        }

        //AAAA
        //AAAA
        //AAAA

        //AAAAAAAAAAAA
        void Test8()
        {
            const char* matrix = "AAAAAAAAAAAA";
            const char* str = "AAAAAAAAAAAA";

            Test("Test8", (const char*) matrix, 3, 4, str, true);
        }

        //AAAA
        //AAAA
        //AAAA

        //AAAAAAAAAAAAA
        void Test9()
        {
            const char* matrix = "AAAAAAAAAAAA";
            const char* str = "AAAAAAAAAAAAA";

            Test("Test9", (const char*) matrix, 3, 4, str, false);
        }

        //A

        //A
        void Test10()
        {
            const char* matrix = "A";
            const char* str = "A";

            Test("Test10", (const char*) matrix, 1, 1, str, true);
        }

        //A

        //B
        void Test11()
        {
            const char* matrix = "A";
            const char* str = "B";

            Test("Test11", (const char*) matrix, 1, 1, str, false);
        }

        void Test12()
        {
            Test("Test12", nullptr, 0, 0, nullptr, false);
        }

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

            return 0;
        }
</stack></string></cstdio>

13. 面试题13:机器人的运动范围

/************* 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;13&#xFF1A;&#x673A;&#x5668;&#x4EBA;&#x7684;&#x8FD0;&#x52A8;&#x8303;&#x56F4;
        // &#x9898;&#x76EE;&#xFF1A;&#x5730;&#x4E0A;&#x6709;&#x4E00;&#x4E2A;m&#x884C;n&#x5217;&#x7684;&#x65B9;&#x683C;&#x3002;&#x4E00;&#x4E2A;&#x673A;&#x5668;&#x4EBA;&#x4ECE;&#x5750;&#x6807;(0, 0)&#x7684;&#x683C;&#x5B50;&#x5F00;&#x59CB;&#x79FB;&#x52A8;&#xFF0C;&#x5B83;
        // &#x6BCF;&#x4E00;&#x6B21;&#x53EF;&#x4EE5;&#x5411;&#x5DE6;&#x3001;&#x53F3;&#x3001;&#x4E0A;&#x3001;&#x4E0B;&#x79FB;&#x52A8;&#x4E00;&#x683C;&#xFF0C;&#x4F46;&#x4E0D;&#x80FD;&#x8FDB;&#x5165;&#x884C;&#x5750;&#x6807;&#x548C;&#x5217;&#x5750;&#x6807;&#x7684;&#x6570;&#x4F4D;&#x4E4B;&#x548C;
        // &#x5927;&#x4E8E;k&#x7684;&#x683C;&#x5B50;&#x3002;&#x4F8B;&#x5982;&#xFF0C;&#x5F53;k&#x4E3A;18&#x65F6;&#xFF0C;&#x673A;&#x5668;&#x4EBA;&#x80FD;&#x591F;&#x8FDB;&#x5165;&#x65B9;&#x683C;(35, 37)&#xFF0C;&#x56E0;&#x4E3A;3+5+3+7=18&#x3002;
        // &#x4F46;&#x5B83;&#x4E0D;&#x80FD;&#x8FDB;&#x5165;&#x65B9;&#x683C;(35, 38)&#xFF0C;&#x56E0;&#x4E3A;3+5+3+8=19&#x3002;&#x8BF7;&#x95EE;&#x8BE5;&#x673A;&#x5668;&#x4EBA;&#x80FD;&#x591F;&#x5230;&#x8FBE;&#x591A;&#x5C11;&#x4E2A;&#x683C;&#x5B50;&#xFF1F;

        #include <cstdio>

        int movingCountCore(int threshold, int rows, int cols, int row, int col, bool* visited);
        bool check(int threshold, int rows, int cols, int row, int col, bool* visited);
        int getDigitSum(int number);

        int movingCount(int threshold, int rows, int cols)
        {
            if(threshold < 0 || rows <= 0 || cols <="0)" return 0; bool *visited="new" bool[rows * cols]; for(int i="0;" rows cols; ++i) visited[i]="false;" int count="movingCountCore(threshold," rows, cols, 0, visited); delete[] visited; count; } movingcountcore(int threshold, row, col, bool* visited) { if(check(threshold, visited)) visited[row + col]="true;" movingcountcore(threshold, row - 1, col check(int if(row>= 0 && row < rows && col >= 0 && col < cols
                && getDigitSum(row) + getDigitSum(col) <= threshold && !visited[row* cols + col]) return true; false; } int getdigitsum(int number) { sum="0;" while(number> 0)
            {
                sum += number % 10;
                number /= 10;
            }

            return sum;
        }

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

            if(movingCount(threshold, rows, cols) == expected)
                printf("Passed.\n");
            else
                printf("FAILED.\n");
        }

        // &#x65B9;&#x683C;&#x591A;&#x884C;&#x591A;&#x5217;
        void test1()
        {
            test("Test1", 5, 10, 10, 21);
        }

        // &#x65B9;&#x683C;&#x591A;&#x884C;&#x591A;&#x5217;
        void test2()
        {
            test("Test2", 15, 20, 20, 359);
        }

        // &#x65B9;&#x683C;&#x53EA;&#x6709;&#x4E00;&#x884C;&#xFF0C;&#x673A;&#x5668;&#x4EBA;&#x53EA;&#x80FD;&#x5230;&#x8FBE;&#x90E8;&#x5206;&#x65B9;&#x683C;
        void test3()
        {
            test("Test3", 10, 1, 100, 29);
        }

        // &#x65B9;&#x683C;&#x53EA;&#x6709;&#x4E00;&#x884C;&#xFF0C;&#x673A;&#x5668;&#x4EBA;&#x80FD;&#x5230;&#x8FBE;&#x6240;&#x6709;&#x65B9;&#x683C;
        void test4()
        {
            test("Test4", 10, 1, 10, 10);
        }

        // &#x65B9;&#x683C;&#x53EA;&#x6709;&#x4E00;&#x5217;&#xFF0C;&#x673A;&#x5668;&#x4EBA;&#x53EA;&#x80FD;&#x5230;&#x8FBE;&#x90E8;&#x5206;&#x65B9;&#x683C;
        void test5()
        {
            test("Test5", 15, 100, 1, 79);
        }

        // &#x65B9;&#x683C;&#x53EA;&#x6709;&#x4E00;&#x5217;&#xFF0C;&#x673A;&#x5668;&#x4EBA;&#x80FD;&#x5230;&#x8FBE;&#x6240;&#x6709;&#x65B9;&#x683C;
        void test6()
        {
            test("Test6", 15, 10, 1, 10);
        }

        // &#x65B9;&#x683C;&#x53EA;&#x6709;&#x4E00;&#x884C;&#x4E00;&#x5217;
        void test7()
        {
            test("Test7", 15, 1, 1, 1);
        }

        // &#x65B9;&#x683C;&#x53EA;&#x6709;&#x4E00;&#x884C;&#x4E00;&#x5217;
        void test8()
        {
            test("Test8", 0, 1, 1, 1);
        }

        // &#x673A;&#x5668;&#x4EBA;&#x4E0D;&#x80FD;&#x8FDB;&#x5165;&#x4EFB;&#x610F;&#x4E00;&#x4E2A;&#x65B9;&#x683C;
        void test9()
        {
            test("Test9", -10, 10, 10, 0);
        }

        int main(int agrc, char* argv[])
        {
            test1();
            test2();
            test3();
            test4();
            test5();
            test6();
            test7();
            test8();
            test9();

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

14. 面试题14:剪绳子

    /*******************************************************************
    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;14&#xFF1A;&#x526A;&#x7EF3;&#x5B50;
    // &#x9898;&#x76EE;&#xFF1A;&#x7ED9;&#x4F60;&#x4E00;&#x6839;&#x957F;&#x5EA6;&#x4E3A;n&#x7EF3;&#x5B50;&#xFF0C;&#x8BF7;&#x628A;&#x7EF3;&#x5B50;&#x526A;&#x6210;m&#x6BB5;&#xFF08;m&#x3001;n&#x90FD;&#x662F;&#x6574;&#x6570;&#xFF0C;n>1&#x5E76;&#x4E14;m&#x2265;1&#xFF09;&#x3002;
    // &#x6BCF;&#x6BB5;&#x7684;&#x7EF3;&#x5B50;&#x7684;&#x957F;&#x5EA6;&#x8BB0;&#x4E3A;k[0]&#x3001;k[1]&#x3001;&#x2026;&#x2026;&#x3001;k[m]&#x3002;k[0]*k[1]*&#x2026;*k[m]&#x53EF;&#x80FD;&#x7684;&#x6700;&#x5927;&#x4E58;
    // &#x79EF;&#x662F;&#x591A;&#x5C11;&#xFF1F;&#x4F8B;&#x5982;&#x5F53;&#x7EF3;&#x5B50;&#x7684;&#x957F;&#x5EA6;&#x662F;8&#x65F6;&#xFF0C;&#x6211;&#x4EEC;&#x628A;&#x5B83;&#x526A;&#x6210;&#x957F;&#x5EA6;&#x5206;&#x522B;&#x4E3A;2&#x3001;3&#x3001;3&#x7684;&#x4E09;&#x6BB5;&#xFF0C;&#x6B64;
    // &#x65F6;&#x5F97;&#x5230;&#x6700;&#x5927;&#x7684;&#x4E58;&#x79EF;18&#x3002;

    #include <iostream>
    #include <cmath>

    // ====================&#x52A8;&#x6001;&#x89C4;&#x5212;====================
    int maxProductAfterCutting_solution1(int length)
    {
        if(length < 2)
            return 0;
        if(length == 2)
            return 1;
        if(length == 3)
            return 2;

        int* products = new int[length + 1];
        products[0] = 0;
        products[1] = 1;
        products[2] = 2;
        products[3] = 3;

        int max = 0;
        for(int i = 4; i <= length; ++i) { max="0;" for(int j="1;" <="i" 2; ++j) int product="products[j]" * products[i - j]; if(max product) products[i]="max;" } delete[] products; return max; =="==================&#x8D2A;&#x5A6A;&#x7B97;&#x6CD5;====================" maxproductaftercutting_solution2(int length) if(length 2) 0; 1; 3) 尽可能多地减去长度为3的绳子段 timesof3="length" 3; 当绳子最后剩下的长度为4的时候,不能再剪去长度为3的绳子段。 此时更好的方法是把绳子剪成长度为2的两段,因为2*2> 3*1&#x3002;
        if(length - timesOf3 * 3 == 1)
            timesOf3 -= 1;

        int timesOf2 = (length - timesOf3 * 3) / 2;

        return (int) (pow(3, timesOf3)) * (int) (pow(2, timesOf2));
    }

    // ====================&#x6D4B;&#x8BD5;&#x4EE3;&#x7801;====================
    void test(const char* testName, int length, int expected)
    {
        int result1 = maxProductAfterCutting_solution1(length);
        if(result1 == expected)
            std::cout << "Solution1 for " << testName << " passed." << std::endl;
        else
            std::cout << "Solution1 for " << testName << " FAILED." << std::endl;

        int result2 = maxProductAfterCutting_solution2(length);
        if(result2 == expected)
            std::cout << "Solution2 for " << testName << " passed." << std::endl;
        else
            std::cout << "Solution2 for " << testName << " FAILED." << std::endl;
    }

    void test1()
    {
        int length = 1;
        int expected = 0;
        test("test1", length, expected);
    }

    void test2()
    {
        int length = 2;
        int expected = 1;
        test("test2", length, expected);
    }

    void test3()
    {
        int length = 3;
        int expected = 2;
        test("test3", length, expected);
    }

    void test4()
    {
        int length = 4;
        int expected = 4;
        test("test4", length, expected);
    }

    void test5()
    {
        int length = 5;
        int expected = 6;
        test("test5", length, expected);
    }

    void test6()
    {
        int length = 6;
        int expected = 9;
        test("test6", length, expected);
    }

    void test7()
    {
        int length = 7;
        int expected = 12;
        test("test7", length, expected);
    }

    void test8()
    {
        int length = 8;
        int expected = 18;
        test("test8", length, expected);
    }

    void test9()
    {
        int length = 9;
        int expected = 27;
        test("test9", length, expected);
    }

    void test10()
    {
        int length = 10;
        int expected = 36;
        test("test10", length, expected);
    }

    void test11()
    {
        int length = 50;
        int expected = 86093442;
        test("test11", length, expected);
    }

    int main(int agrc, char* argv[])
    {
        test1();
        test2();
        test3();
        test4();
        test5();
        test6();
        test7();
        test8();
        test9();
        test10();
        test11();

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

15. 面试题15:二进制中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;15&#xFF1A;&#x4E8C;&#x8FDB;&#x5236;&#x4E2D;1&#x7684;&#x4E2A;&#x6570;
    // &#x9898;&#x76EE;&#xFF1A;&#x8BF7;&#x5B9E;&#x73B0;&#x4E00;&#x4E2A;&#x51FD;&#x6570;&#xFF0C;&#x8F93;&#x5165;&#x4E00;&#x4E2A;&#x6574;&#x6570;&#xFF0C;&#x8F93;&#x51FA;&#x8BE5;&#x6570;&#x4E8C;&#x8FDB;&#x5236;&#x8868;&#x793A;&#x4E2D;1&#x7684;&#x4E2A;&#x6570;&#x3002;&#x4F8B;&#x5982;
    // &#x628A;9&#x8868;&#x793A;&#x6210;&#x4E8C;&#x8FDB;&#x5236;&#x662F;1001&#xFF0C;&#x6709;2&#x4F4D;&#x662F;1&#x3002;&#x56E0;&#x6B64;&#x5982;&#x679C;&#x8F93;&#x5165;9&#xFF0C;&#x8BE5;&#x51FD;&#x6570;&#x8F93;&#x51FA;2&#x3002;

    #include <cstdio>

    int NumberOf1_Solution1(int n)
    {
        int count = 0;
        unsigned int flag = 1;
        while (flag)
        {
            if (n & flag)
                count++;

            flag = flag << 1;
        }

        return count;
    }

    int NumberOf1_Solution2(int n)
    {
        int count = 0;

        while (n)
        {
            ++count;
            n = (n - 1) & n;
        }

        return count;
    }

    // ====================&#x6D4B;&#x8BD5;&#x4EE3;&#x7801;====================
    void Test(int number, unsigned int expected)
    {
        int actual = NumberOf1_Solution1(number);
        if (actual == expected)
            printf("Solution1: Test for %p passed.\n", number);
        else
            printf("Solution1: Test for %p failed.\n", number);

        actual = NumberOf1_Solution2(number);
        if (actual == expected)
            printf("Solution2: Test for %p passed.\n", number);
        else
            printf("Solution2: Test for %p failed.\n", number);

        printf("\n");
    }

    int main(int argc, char* argv[])
    {
        // &#x8F93;&#x5165;0&#xFF0C;&#x671F;&#x5F85;&#x7684;&#x8F93;&#x51FA;&#x662F;0
        Test(0, 0);

        // &#x8F93;&#x5165;1&#xFF0C;&#x671F;&#x5F85;&#x7684;&#x8F93;&#x51FA;&#x662F;1
        Test(1, 1);

        // &#x8F93;&#x5165;10&#xFF0C;&#x671F;&#x5F85;&#x7684;&#x8F93;&#x51FA;&#x662F;2
        Test(10, 2);

        // &#x8F93;&#x5165;0x7FFFFFFF&#xFF0C;&#x671F;&#x5F85;&#x7684;&#x8F93;&#x51FA;&#x662F;31
        Test(0x7FFFFFFF, 31);

        // &#x8F93;&#x5165;0xFFFFFFFF&#xFF08;&#x8D1F;&#x6570;&#xFF09;&#xFF0C;&#x671F;&#x5F85;&#x7684;&#x8F93;&#x51FA;&#x662F;32
        Test(0xFFFFFFFF, 32);

        // &#x8F93;&#x5165;0x80000000&#xFF08;&#x8D1F;&#x6570;&#xFF09;&#xFF0C;&#x671F;&#x5F85;&#x7684;&#x8F93;&#x51FA;&#x662F;1
        Test(0x80000000, 1);

        return 0;
    }
</cstdio>

17. 面试题17:打印1到最大的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;17&#xFF1A;&#x6253;&#x5370;1&#x5230;&#x6700;&#x5927;&#x7684;n&#x4F4D;&#x6570;
    // &#x9898;&#x76EE;&#xFF1A;&#x8F93;&#x5165;&#x6570;&#x5B57;n&#xFF0C;&#x6309;&#x987A;&#x5E8F;&#x6253;&#x5370;&#x51FA;&#x4ECE;1&#x6700;&#x5927;&#x7684;n&#x4F4D;&#x5341;&#x8FDB;&#x5236;&#x6570;&#x3002;&#x6BD4;&#x5982;&#x8F93;&#x5165;3&#xFF0C;&#x5219;
    // &#x6253;&#x5370;&#x51FA;1&#x3001;2&#x3001;3&#x4E00;&#x76F4;&#x5230;&#x6700;&#x5927;&#x7684;3&#x4F4D;&#x6570;&#x5373;999&#x3002;

    #include <cstdio>
    #include <memory>

    void PrintNumber(char* number);
    bool Increment(char* number);
    void Print1ToMaxOfNDigitsRecursively(char* number, int length, int index);

    // ====================&#x65B9;&#x6CD5;&#x4E00;====================
    void Print1ToMaxOfNDigits_1(int n)
    {
        if (n <= 0) return; char *number="new" char[n + 1]; memset(number, '0', n); number[n]="\0" ; while (!increment(number)) { printnumber(number); } delete[]number; 字符串number表示一个数字,在 number上增加1 如果做加法溢出,则返回true;否则为false bool increment(char* number) isoverflow="false;" int ntakeover="0;" nlength="strlen(number);" for (int i="nLength" - 1;>= 0; i--)
        {
            int nSum = number[i] - '0' + nTakeOver;
            if (i == nLength - 1)
                nSum++;

            if (nSum >= 10)
            {
                if (i == 0)
                    isOverflow = true;
                else
                {
                    nSum -= 10;
                    nTakeOver = 1;
                    number[i] = '0' + nSum;
                }
            }
            else
            {
                number[i] = '0' + nSum;
                break;
            }
        }

        return isOverflow;
    }

    // ====================&#x65B9;&#x6CD5;&#x4E8C;====================
    void Print1ToMaxOfNDigits_2(int n)
    {
        if (n <= 0) return; char* number="new" char[n + 1]; number[n]="\0" ; for (int i="0;" < 10; ++i) { number[0]="i" '0'; print1tomaxofndigitsrecursively(number, n, 0); } delete[] number; void print1tomaxofndigitsrecursively(char* number, int length, index) if (index="=" length - 1) printnumber(number); number[index 1]="i" index 1); =="==================&#x516C;&#x5171;&#x51FD;&#x6570;====================" 字符串number表示一个数字,数字有若干个0开头 打印出这个数字,并忽略开头的0 printnumber(char* number) bool isbeginning0="true;" nlength="strlen(number);" nlength; (isbeginning0 && number[i] !="0" ) (!isbeginning0) printf("%c", number[i]); printf("\t"); test(int n) printf("test %d begins:\n", n); print1tomaxofndigits_1(n); print1tomaxofndigits_2(n); printf("\ntest ends.\n", main(int argc, argv[]) test(1); test(2); test(3); test(0); test(-1); return 0; code></=></=></memory></cstdio>

19. 面试题19:正则表达式匹配

    /*******************************************************************
    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;19&#xFF1A;&#x6B63;&#x5219;&#x8868;&#x8FBE;&#x5F0F;&#x5339;&#x914D;
    // &#x9898;&#x76EE;&#xFF1A;&#x8BF7;&#x5B9E;&#x73B0;&#x4E00;&#x4E2A;&#x51FD;&#x6570;&#x7528;&#x6765;&#x5339;&#x914D;&#x5305;&#x542B;'.'&#x548C;'*'&#x7684;&#x6B63;&#x5219;&#x8868;&#x8FBE;&#x5F0F;&#x3002;&#x6A21;&#x5F0F;&#x4E2D;&#x7684;&#x5B57;&#x7B26;'.'
    // &#x8868;&#x793A;&#x4EFB;&#x610F;&#x4E00;&#x4E2A;&#x5B57;&#x7B26;&#xFF0C;&#x800C;'*'&#x8868;&#x793A;&#x5B83;&#x524D;&#x9762;&#x7684;&#x5B57;&#x7B26;&#x53EF;&#x4EE5;&#x51FA;&#x73B0;&#x4EFB;&#x610F;&#x6B21;&#xFF08;&#x542B;0&#x6B21;&#xFF09;&#x3002;&#x5728;&#x672C;&#x9898;
    // &#x4E2D;&#xFF0C;&#x5339;&#x914D;&#x662F;&#x6307;&#x5B57;&#x7B26;&#x4E32;&#x7684;&#x6240;&#x6709;&#x5B57;&#x7B26;&#x5339;&#x914D;&#x6574;&#x4E2A;&#x6A21;&#x5F0F;&#x3002;&#x4F8B;&#x5982;&#xFF0C;&#x5B57;&#x7B26;&#x4E32;"aaa"&#x4E0E;&#x6A21;&#x5F0F;"a.a"
    // &#x548C;"ab*ac*a"&#x5339;&#x914D;&#xFF0C;&#x4F46;&#x4E0E;"aa.a"&#x53CA;"ab*a"&#x5747;&#x4E0D;&#x5339;&#x914D;&#x3002;

    #include <cstdio>

    bool matchCore(const char* str, const char* pattern);

    bool match(const char* str, const char* pattern)
    {
        if(str == nullptr || pattern == nullptr)
            return false;

        return matchCore(str, pattern);
    }

    bool matchCore(const char* str, const char* pattern)
    {
        if(*str == '\0' && *pattern == '\0')
            return true;

        if(*str != '\0' && *pattern == '\0')
            return false;

        if(*(pattern + 1) == '*')
        {
            if(*pattern == *str || (*pattern == '.' && *str != '\0'))
                // &#x8FDB;&#x5165;&#x6709;&#x9650;&#x72B6;&#x6001;&#x673A;&#x7684;&#x4E0B;&#x4E00;&#x4E2A;&#x72B6;&#x6001;
                return matchCore(str + 1, pattern + 2)
                // &#x7EE7;&#x7EED;&#x7559;&#x5728;&#x6709;&#x9650;&#x72B6;&#x6001;&#x673A;&#x7684;&#x5F53;&#x524D;&#x72B6;&#x6001;
                || matchCore(str + 1, pattern)
                // &#x7565;&#x8FC7;&#x4E00;&#x4E2A;'*'
                || matchCore(str, pattern + 2);
            else
                // &#x7565;&#x8FC7;&#x4E00;&#x4E2A;'*'
                return matchCore(str, pattern + 2);
        }

        if(*str == *pattern || (*pattern == '.' && *str != '\0'))
            return matchCore(str + 1, pattern + 1);

        return false;
    }

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

        if(match(string, pattern) == expected)
            printf("Passed.\n");
        else
            printf("FAILED.\n");
    }

    int main(int argc, char* argv[])
    {
        Test("Test01", "", "", true);
        Test("Test02", "", ".*", true);
        Test("Test03", "", ".", false);
        Test("Test04", "", "c*", true);
        Test("Test05", "a", ".*", true);
        Test("Test06", "a", "a.", false);
        Test("Test07", "a", "", false);
        Test("Test08", "a", ".", true);
        Test("Test09", "a", "ab*", true);
        Test("Test10", "a", "ab*a", false);
        Test("Test11", "aa", "aa", true);
        Test("Test12", "aa", "a*", true);
        Test("Test13", "aa", ".*", true);
        Test("Test14", "aa", ".", false);
        Test("Test15", "ab", ".*", true);
        Test("Test16", "ab", ".*", true);
        Test("Test17", "aaa", "aa*", true);
        Test("Test18", "aaa", "aa.a", false);
        Test("Test19", "aaa", "a.a", true);
        Test("Test20", "aaa", ".a", false);
        Test("Test21", "aaa", "a*a", true);
        Test("Test22", "aaa", "ab*a", false);
        Test("Test23", "aaa", "ab*ac*a", true);
        Test("Test24", "aaa", "ab*a*c*a", true);
        Test("Test25", "aaa", ".*", true);
        Test("Test26", "aab", "c*a*b", true);
        Test("Test27", "aaca", "ab*a*c*a", true);
        Test("Test28", "aaba", "ab*a*c*a", false);
        Test("Test29", "bbbba", ".*a*a", true);
        Test("Test30", "bcbbabab", ".*a*a", false);

        return 0;
    }
</cstdio>

29. 面试题29:顺时针打印矩阵

            /*******************************************************************
            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;29&#xFF1A;&#x987A;&#x65F6;&#x9488;&#x6253;&#x5370;&#x77E9;&#x9635;
            // &#x9898;&#x76EE;&#xFF1A;&#x8F93;&#x5165;&#x4E00;&#x4E2A;&#x77E9;&#x9635;&#xFF0C;&#x6309;&#x7167;&#x4ECE;&#x5916;&#x5411;&#x91CC;&#x4EE5;&#x987A;&#x65F6;&#x9488;&#x7684;&#x987A;&#x5E8F;&#x4F9D;&#x6B21;&#x6253;&#x5370;&#x51FA;&#x6BCF;&#x4E00;&#x4E2A;&#x6570;&#x5B57;&#x3002;

            #include <cstdio>

            void PrintMatrixInCircle(int** numbers, int columns, int rows, int start);
            void printNumber(int number);

            void PrintMatrixClockwisely(int** numbers, int columns, int rows)
            {
                if(numbers == nullptr || columns <= 0 || rows <="0)" return; int start="0;" while(columns> start * 2 && rows > start * 2)
                {
                    PrintMatrixInCircle(numbers, columns, rows, start);

                    ++start;
                }
            }

            void PrintMatrixInCircle(int** numbers, int columns, int rows, int start)
            {
                int endX = columns - 1 - start;
                int endY = rows - 1 - start;

                // &#x4ECE;&#x5DE6;&#x5230;&#x53F3;&#x6253;&#x5370;&#x4E00;&#x884C;
                for(int i = start; i <= endx; ++i) { int number="numbers[start][i];" printnumber(number); } 从上到下打印一列 if(start < endy) for(int i="start" + 1; 从右到左打印一行 endx && start ->= start; --i)
                    {
                        int number = numbers[endY][i];
                        printNumber(number);
                    }
                }

                // &#x4ECE;&#x4E0B;&#x5230;&#x4E0A;&#x6253;&#x5370;&#x4E00;&#x884C;
                if(start < endX && start < endY - 1)
                {
                    for(int i = endY - 1; i >= start + 1; --i)
                    {
                        int number = numbers[i][start];
                        printNumber(number);
                    }
                }
            }

            void printNumber(int number)
            {
                printf("%d\t", number);
            }

            // ====================&#x6D4B;&#x8BD5;&#x4EE3;&#x7801;====================
            void Test(int columns, int rows)
            {
                printf("Test Begin: %d columns, %d rows.\n", columns, rows);

                if(columns < 1 || rows < 1)
                    return;

                int** numbers = new int*[rows];
                for(int i = 0; i < rows; ++i)
                {
                    numbers[i] = new int[columns];
                    for(int j = 0; j < columns; ++j)
                    {
                        numbers[i][j] = i * columns + j + 1;
                    }
                }

                PrintMatrixClockwisely(numbers, columns, rows);
                printf("\n");

                for(int i = 0; i < rows; ++i)
                    delete[] (int*)numbers[i];

                delete[] numbers;
            }

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

                /*
                1    2
                3    4
                */
                Test(2, 2);

                /*
                1    2    3    4
                5    6    7    8
                9    10   11   12
                13   14   15   16
                */
                Test(4, 4);

                /*
                1    2    3    4    5
                6    7    8    9    10
                11   12   13   14   15
                16   17   18   19   20
                21   22   23   24   25
                */
                Test(5, 5);

                /*
                1
                2
                3
                4
                5
                */
                Test(1, 5);

                /*
                1    2
                3    4
                5    6
                7    8
                9    10
                */
                Test(2, 5);

                /*
                1    2    3
                4    5    6
                7    8    9
                10   11   12
                13   14   15
                */
                Test(3, 5);

                /*
                1    2    3    4
                5    6    7    8
                9    10   11   12
                13   14   15   16
                17   18   19   20
                */
                Test(4, 5);

                /*
                1    2    3    4    5
                */
                Test(5, 1);

                /*
                1    2    3    4    5
                6    7    8    9    10
                */
                Test(5, 2);

                /*
                1    2    3    4    5
                6    7    8    9    10
                11   12   13   14    15
                */
                Test(5, 3);

                /*
                1    2    3    4    5
                6    7    8    9    10
                11   12   13   14   15
                16   17   18   19   20
                */
                Test(5, 4);

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

40. 面试题40:最小的k个数

    /*******************************************************************
    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;40&#xFF1A;&#x6700;&#x5C0F;&#x7684;k&#x4E2A;&#x6570;
    // &#x9898;&#x76EE;&#xFF1A;&#x8F93;&#x5165;n&#x4E2A;&#x6574;&#x6570;&#xFF0C;&#x627E;&#x51FA;&#x5176;&#x4E2D;&#x6700;&#x5C0F;&#x7684;k&#x4E2A;&#x6570;&#x3002;&#x4F8B;&#x5982;&#x8F93;&#x5165;4&#x3001;5&#x3001;1&#x3001;6&#x3001;2&#x3001;7&#x3001;3&#x3001;8
    // &#x8FD9;8&#x4E2A;&#x6570;&#x5B57;&#xFF0C;&#x5219;&#x6700;&#x5C0F;&#x7684;4&#x4E2A;&#x6570;&#x5B57;&#x662F;1&#x3001;2&#x3001;3&#x3001;4&#x3002;

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

    #include <set>
    #include <vector>
    #include <iostream>
    #include <functional>

    using namespace std;

    // ====================&#x65B9;&#x6CD5;1====================
    void GetLeastNumbers_Solution1(int* input, int n, int* output, int k)
    {
        if(input == nullptr || output == nullptr || k > n || n <= 0 || k <="0)" return; int start="0;" end="n" - 1; index="Partition(input," n, start, end); while(index !="k" 1) { if(index> k - 1)
            {
                end = index - 1;
                index = Partition(input, n, start, end);
            }
            else
            {
                start = index + 1;
                index = Partition(input, n, start, end);
            }
        }

        for(int i = 0; i < k; ++i)
            output[i] = input[i];
    }

    // ====================&#x65B9;&#x6CD5;2====================
    typedef multiset<int, std::greater<int> >            intSet;
    typedef multiset<int, std::greater<int> >::iterator  setIterator;

    void GetLeastNumbers_Solution2(const vector<int>& data, intSet& leastNumbers, int k)
    {
        leastNumbers.clear();

        if(k < 1 || data.size() < k)
            return;

        vector<int>::const_iterator iter = data.begin();
        for(; iter != data.end(); ++ iter)
        {
            if((leastNumbers.size()) < k)
                leastNumbers.insert(*iter);

            else
            {
                setIterator iterGreatest = leastNumbers.begin();

                if(*iter < *(leastNumbers.begin()))
                {
                    leastNumbers.erase(iterGreatest);
                    leastNumbers.insert(*iter);
                }
            }
        }
    }

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

        vector<int> vectorData;
        for(int i = 0; i < n; ++ i)
            vectorData.push_back(data[i]);

        if(expectedResult == nullptr)
            printf("The input is invalid, we don't expect any result.\n");
        else
        {
            printf("Expected result: \n");
            for(int i = 0; i < k; ++ i)
                printf("%d\t", expectedResult[i]);
            printf("\n");
        }

        printf("Result for solution1:\n");
        int* output = new int[k];
        GetLeastNumbers_Solution1(data, n, output, k);
        if(expectedResult != nullptr)
        {
            for(int i = 0; i < k; ++ i)
                printf("%d\t", output[i]);
            printf("\n");
        }

        delete[] output;

        printf("Result for solution2:\n");
        intSet leastNumbers;
        GetLeastNumbers_Solution2(vectorData, leastNumbers, k);
        printf("The actual output numbers are:\n");
        for(setIterator iter = leastNumbers.begin(); iter != leastNumbers.end(); ++iter)
            printf("%d\t", *iter);
        printf("\n\n");
    }

    // k&#x5C0F;&#x4E8E;&#x6570;&#x7EC4;&#x7684;&#x957F;&#x5EA6;
    void Test1()
    {
        int data[] = {4, 5, 1, 6, 2, 7, 3, 8};
        int expected[] = {1, 2, 3, 4};
        Test("Test1", data, sizeof(data) / sizeof(int), expected, sizeof(expected) / sizeof(int));
    }

    // k&#x7B49;&#x4E8E;&#x6570;&#x7EC4;&#x7684;&#x957F;&#x5EA6;
    void Test2()
    {
        int data[] = {4, 5, 1, 6, 2, 7, 3, 8};
        int expected[] = {1, 2, 3, 4, 5, 6, 7, 8};
        Test("Test2", data, sizeof(data) / sizeof(int), expected, sizeof(expected) / sizeof(int));
    }

    // k&#x5927;&#x4E8E;&#x6570;&#x7EC4;&#x7684;&#x957F;&#x5EA6;
    void Test3()
    {
        int data[] = {4, 5, 1, 6, 2, 7, 3, 8};
        int* expected = nullptr;
        Test("Test3", data, sizeof(data) / sizeof(int), expected, 10);
    }

    // k&#x7B49;&#x4E8E;1
    void Test4()
    {
        int data[] = {4, 5, 1, 6, 2, 7, 3, 8};
        int expected[] = {1};
        Test("Test4", data, sizeof(data) / sizeof(int), expected, sizeof(expected) / sizeof(int));
    }

    // k&#x7B49;&#x4E8E;0
    void Test5()
    {
        int data[] = {4, 5, 1, 6, 2, 7, 3, 8};
        int* expected = nullptr;
        Test("Test5", data, sizeof(data) / sizeof(int), expected, 0);
    }

    // &#x6570;&#x7EC4;&#x4E2D;&#x6709;&#x76F8;&#x540C;&#x7684;&#x6570;&#x5B57;
    void Test6()
    {
        int data[] = {4, 5, 1, 6, 2, 7, 2, 8};
        int expected[] = {1, 2};
        Test("Test6", data, sizeof(data) / sizeof(int), expected, sizeof(expected) / sizeof(int));
    }

    // &#x8F93;&#x5165;&#x7A7A;&#x6307;&#x9488;
    void Test7()
    {
        int* expected = nullptr;
        Test("Test7", nullptr, 0, expected, 0);
    }

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

        return 0;
    }
</int></int></int></int,></int,></=></functional></iostream></vector></set></cstdio>

41. 面试题41:数据流中的中位数

    /*******************************************************************
    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;41&#xFF1A;&#x6570;&#x636E;&#x6D41;&#x4E2D;&#x7684;&#x4E2D;&#x4F4D;&#x6570;
    // &#x9898;&#x76EE;&#xFF1A;&#x5982;&#x4F55;&#x5F97;&#x5230;&#x4E00;&#x4E2A;&#x6570;&#x636E;&#x6D41;&#x4E2D;&#x7684;&#x4E2D;&#x4F4D;&#x6570;&#xFF1F;&#x5982;&#x679C;&#x4ECE;&#x6570;&#x636E;&#x6D41;&#x4E2D;&#x8BFB;&#x51FA;&#x5947;&#x6570;&#x4E2A;&#x6570;&#x503C;&#xFF0C;&#x90A3;&#x4E48;
    // &#x4E2D;&#x4F4D;&#x6570;&#x5C31;&#x662F;&#x6240;&#x6709;&#x6570;&#x503C;&#x6392;&#x5E8F;&#x4E4B;&#x540E;&#x4F4D;&#x4E8E;&#x4E2D;&#x95F4;&#x7684;&#x6570;&#x503C;&#x3002;&#x5982;&#x679C;&#x4ECE;&#x6570;&#x636E;&#x6D41;&#x4E2D;&#x8BFB;&#x51FA;&#x5076;&#x6570;&#x4E2A;&#x6570;&#x503C;&#xFF0C;
    // &#x90A3;&#x4E48;&#x4E2D;&#x4F4D;&#x6570;&#x5C31;&#x662F;&#x6240;&#x6709;&#x6570;&#x503C;&#x6392;&#x5E8F;&#x4E4B;&#x540E;&#x4E2D;&#x95F4;&#x4E24;&#x4E2A;&#x6570;&#x7684;&#x5E73;&#x5747;&#x503C;&#x3002;

    #include <cstdio>
    #include <algorithm>
    #include <vector>
    #include <functional>

    using namespace std;

    template<typename t> class DynamicArray
    {
    public:
        void Insert(T num)
        {
            if(((min.size() + max.size()) & 1) == 0)
            {
                if(max.size() > 0 && num < max[0])
                {
                    max.push_back(num);
                    push_heap(max.begin(), max.end(), less<t>());

                    num = max[0];

                    pop_heap(max.begin(), max.end(), less<t>());
                    max.pop_back();
                }

                min.push_back(num);
                push_heap(min.begin(), min.end(), greater<t>());
            }
            else
            {
                if(min.size() > 0 && min[0] < num)
                {
                    min.push_back(num);
                    push_heap(min.begin(), min.end(), greater<t>());

                    num = min[0];

                    pop_heap(min.begin(), min.end(), greater<t>());
                    min.pop_back();
                }

                max.push_back(num);
                push_heap(max.begin(), max.end(), less<t>());
            }
        }

        T GetMedian()
        {
            int size = min.size() + max.size();
            if(size == 0)
                throw exception("No numbers are available");

            T median = 0;
            if((size & 1) == 1)
                median = min[0];
            else
                median = (min[0] + max[0]) / 2;

            return median;
        }

    private:
        vector<t> min;
        vector<t> max;
    };

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

        if(abs(numbers.GetMedian() - expected) < 0.0000001)
            printf("Passed.\n");
        else
            printf("FAILED.\n");
    }

    int main(int argc, char* argv[])
    {
        DynamicArray<double> numbers;

        printf("Test1 begins: ");
        try
        {
            numbers.GetMedian();
            printf("FAILED.\n");
        }
        catch(const exception&)
        {
            printf("Passed.\n");
        }

        numbers.Insert(5);
        Test("Test2", numbers, 5);

        numbers.Insert(2);
        Test("Test3", numbers, 3.5);

        numbers.Insert(3);
        Test("Test4", numbers, 3);

        numbers.Insert(4);
        Test("Test6", numbers, 3.5);

        numbers.Insert(1);
        Test("Test5", numbers, 3);

        numbers.Insert(6);
        Test("Test7", numbers, 3.5);

        numbers.Insert(7);
        Test("Test8", numbers, 4);

        numbers.Insert(0);
        Test("Test9", numbers, 3.5);

        numbers.Insert(8);
        Test("Test10", numbers, 4);

        return 0;
    }
</double></double></t></t></t></t></t></t></t></t></typename></functional></vector></algorithm></cstdio>

47. 面试题47:礼物的最大价值

        /*******************************************************************
        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;47&#xFF1A;&#x793C;&#x7269;&#x7684;&#x6700;&#x5927;&#x4EF7;&#x503C;
        // &#x9898;&#x76EE;&#xFF1A;&#x5728;&#x4E00;&#x4E2A;m&#xD7;n&#x7684;&#x68CB;&#x76D8;&#x7684;&#x6BCF;&#x4E00;&#x683C;&#x90FD;&#x653E;&#x6709;&#x4E00;&#x4E2A;&#x793C;&#x7269;&#xFF0C;&#x6BCF;&#x4E2A;&#x793C;&#x7269;&#x90FD;&#x6709;&#x4E00;&#x5B9A;&#x7684;&#x4EF7;&#x503C;
        // &#xFF08;&#x4EF7;&#x503C;&#x5927;&#x4E8E;0&#xFF09;&#x3002;&#x4F60;&#x53EF;&#x4EE5;&#x4ECE;&#x68CB;&#x76D8;&#x7684;&#x5DE6;&#x4E0A;&#x89D2;&#x5F00;&#x59CB;&#x62FF;&#x683C;&#x5B50;&#x91CC;&#x7684;&#x793C;&#x7269;&#xFF0C;&#x5E76;&#x6BCF;&#x6B21;&#x5411;&#x5DE6;&#x6216;
        // &#x8005;&#x5411;&#x4E0B;&#x79FB;&#x52A8;&#x4E00;&#x683C;&#x76F4;&#x5230;&#x5230;&#x8FBE;&#x68CB;&#x76D8;&#x7684;&#x53F3;&#x4E0B;&#x89D2;&#x3002;&#x7ED9;&#x5B9A;&#x4E00;&#x4E2A;&#x68CB;&#x76D8;&#x53CA;&#x5176;&#x4E0A;&#x9762;&#x7684;&#x793C;&#x7269;&#xFF0C;&#x8BF7;&#x8BA1;
        // &#x7B97;&#x4F60;&#x6700;&#x591A;&#x80FD;&#x62FF;&#x5230;&#x591A;&#x5C11;&#x4EF7;&#x503C;&#x7684;&#x793C;&#x7269;&#xFF1F;

        #include <algorithm>
        #include <iostream>

        int getMaxValue_solution1(const int* values, int rows, int cols)
        {
            if(values == nullptr || rows <= 0 || cols <="0)" return 0; int** maxvalues="new" int*[rows]; for(int i="0;" rows; ++i) maxvalues[i]="new" int[cols]; { j="0;" cols; ++j) int left="0;" up="0;" if(i> 0)
                        up = maxValues[i - 1][j];

                    if(j > 0)
                        left = maxValues[i][j - 1];

                    maxValues[i][j] = std::max(left, up) + values[i * cols + j];
                }
            }

            int maxValue = maxValues[rows - 1][cols - 1];

            for(int i = 0; i < rows; ++i)
                delete[] maxValues[i];
            delete[] maxValues;

            return maxValue;
        }

        int getMaxValue_solution2(const int* values, int rows, int cols)
        {
            if(values == nullptr || rows <= 0 || cols <="0)" return 0; int* maxvalues="new" int[cols]; for(int i="0;" rows; ++i) { j="0;" cols; ++j) int left="0;" up="0;" if(i> 0)
                        up = maxValues[j];

                    if(j > 0)
                        left = maxValues[j - 1];

                    maxValues[j] = std::max(left, up) + values[i * cols + j];
                }
            }

            int maxValue = maxValues[cols - 1];

            delete[] maxValues;

            return maxValue;
        }

        // ====================&#x6D4B;&#x8BD5;&#x4EE3;&#x7801;====================
        void test(const char* testName, const int* values, int rows, int cols, int expected)
        {
            if(getMaxValue_solution1(values, rows, cols) == expected)
                std::cout << testName << ": solution1 passed." << std::endl;
            else
                std::cout << testName << ": solution1 FAILED." << std::endl;

            if(getMaxValue_solution2(values, rows, cols) == expected)
                std::cout << testName << ": solution2 passed." << std::endl;
            else
                std::cout << testName << ": solution2 FAILED." << std::endl;
        }

        void test1()
        {
            // &#x4E09;&#x884C;&#x4E09;&#x5217;
            int values[][3] = {
                { 1, 2, 3 },
                { 4, 5, 6 },
                { 7, 8, 9 }
            };
            int expected = 29;
            test("test1", (const int*) values, 3, 3, expected);
        }

        void test2()
        {
            //&#x56DB;&#x884C;&#x56DB;&#x5217;
            int values[][4] = {
                { 1, 10, 3, 8 },
                { 12, 2, 9, 6 },
                { 5, 7, 4, 11 },
                { 3, 7, 16, 5 }
            };
            int expected = 53;
            test("test2", (const int*) values, 4, 4, expected);
        }

        void test3()
        {
            // &#x4E00;&#x884C;&#x56DB;&#x5217;
            int values[][4] = {
                { 1, 10, 3, 8 }
            };
            int expected = 22;
            test("test3", (const int*) values, 1, 4, expected);
        }

        void test4()
        {
            int values[4][1] = {
                { 1 },
                { 12 },
                { 5 },
                { 3 }
            };
            int expected = 21;
            test("test4", (const int*) values, 4, 1, expected);
        }

        void test5()
        {
            // &#x4E00;&#x884C;&#x4E00;&#x5217;
            int values[][1] = {
                { 3 }
            };
            int expected = 3;
            test("test5", (const int*) values, 1, 1, expected);
        }

        void test6()
        {
            // &#x7A7A;&#x6307;&#x9488;
            int expected = 0;
            test("test6", nullptr, 0, 0, expected);
        }

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

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

49. 面试题49:丑数

        /*******************************************************************
        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;49&#xFF1A;&#x4E11;&#x6570;
        // &#x9898;&#x76EE;&#xFF1A;&#x6211;&#x4EEC;&#x628A;&#x53EA;&#x5305;&#x542B;&#x56E0;&#x5B50;2&#x3001;3&#x548C;5&#x7684;&#x6570;&#x79F0;&#x4F5C;&#x4E11;&#x6570;&#xFF08;Ugly Number&#xFF09;&#x3002;&#x6C42;&#x6309;&#x4ECE;&#x5C0F;&#x5230;
        // &#x5927;&#x7684;&#x987A;&#x5E8F;&#x7684;&#x7B2C;1500&#x4E2A;&#x4E11;&#x6570;&#x3002;&#x4F8B;&#x5982;6&#x3001;8&#x90FD;&#x662F;&#x4E11;&#x6570;&#xFF0C;&#x4F46;14&#x4E0D;&#x662F;&#xFF0C;&#x56E0;&#x4E3A;&#x5B83;&#x5305;&#x542B;&#x56E0;&#x5B50;7&#x3002;
        // &#x4E60;&#x60EF;&#x4E0A;&#x6211;&#x4EEC;&#x628A;1&#x5F53;&#x505A;&#x7B2C;&#x4E00;&#x4E2A;&#x4E11;&#x6570;&#x3002;

        #include <cstdio>

        // ====================&#x7B97;&#x6CD5;1&#x7684;&#x4EE3;&#x7801;====================
        bool IsUgly(int number)
        {
            while(number % 2 == 0)
                number /= 2;
            while(number % 3 == 0)
                number /= 3;
            while(number % 5 == 0)
                number /= 5;

            return (number == 1) ? true : false;
        }

        int GetUglyNumber_Solution1(int index)
        {
            if(index <= 2 3 5 0) return 0; int number="0;" uglyfound="0;" while(uglyfound < index) { ++number; if(isugly(number)) ++uglyfound; } number; =="==================&#x7B97;&#x6CD5;2&#x7684;&#x4EE3;&#x7801;====================" min(int number1, number2, number3); getuglynumber_solution2(int if(index *puglynumbers="new" int[index]; puglynumbers[0]="1;" nextuglyindex="1;" *pmultiply2="pUglyNumbers;" *pmultiply3="pUglyNumbers;" *pmultiply5="pUglyNumbers;" while(nextuglyindex min="Min(*pMultiply2" * 2, 3, 5); puglynumbers[nextuglyindex]="min;" while(*pmultiply2 ++pmultiply2; while(*pmultiply3 ++pmultiply3; while(*pmultiply5 ++pmultiply5; ++nextuglyindex; ugly="pUglyNumbers[nextUglyIndex" - 1]; delete[] puglynumbers; ugly; number3) number2) ? number1 : number2; number3; min; void test(int index, expected) if(getuglynumber_solution1(index)="=" printf("solution1 passed\n"); else failed\n"); if(getuglynumber_solution2(index)="=" printf("solution2 main(int argc, char* argv[]) test(1, 1); test(2, 2); test(3, 3); test(4, 4); test(5, test(6, 6); test(7, 8); test(8, 9); test(9, 10); test(10, 12); test(11, 15); test(1500, 859963392); test(0, 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);
        }

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

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

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

        // &#x6709;&#x5BF9;&#x5B50;
        void Test11()
        {
            int numbers[] = { 1, 0, 0, 1, 0 };
            Test("Test11", numbers, sizeof(numbers) / sizeof(int), false);
        }

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

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

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

63. 面试题63:股票的最大利润

        /*******************************************************************
        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;63&#xFF1A;&#x80A1;&#x7968;&#x7684;&#x6700;&#x5927;&#x5229;&#x6DA6;
        // &#x9898;&#x76EE;&#xFF1A;&#x5047;&#x8BBE;&#x628A;&#x67D0;&#x80A1;&#x7968;&#x7684;&#x4EF7;&#x683C;&#x6309;&#x7167;&#x65F6;&#x95F4;&#x5148;&#x540E;&#x987A;&#x5E8F;&#x5B58;&#x50A8;&#x5728;&#x6570;&#x7EC4;&#x4E2D;&#xFF0C;&#x8BF7;&#x95EE;&#x4E70;&#x5356;&#x4EA4;&#x6613;&#x8BE5;&#x80A1;
        // &#x7968;&#x53EF;&#x80FD;&#x83B7;&#x5F97;&#x7684;&#x5229;&#x6DA6;&#x662F;&#x591A;&#x5C11;&#xFF1F;&#x4F8B;&#x5982;&#x4E00;&#x53EA;&#x80A1;&#x7968;&#x5728;&#x67D0;&#x4E9B;&#x65F6;&#x95F4;&#x8282;&#x70B9;&#x7684;&#x4EF7;&#x683C;&#x4E3A;{9, 11, 8, 5,
        // 7, 12, 16, 14}&#x3002;&#x5982;&#x679C;&#x6211;&#x4EEC;&#x80FD;&#x5728;&#x4EF7;&#x683C;&#x4E3A;5&#x7684;&#x65F6;&#x5019;&#x4E70;&#x5165;&#x5E76;&#x5728;&#x4EF7;&#x683C;&#x4E3A;16&#x65F6;&#x5356;&#x51FA;&#xFF0C;&#x5219;&#x80FD;
        // &#x6536;&#x83B7;&#x6700;&#x5927;&#x7684;&#x5229;&#x6DA6;11&#x3002;

        #include <cstdio>

        int MaxDiff(const int* numbers, unsigned length)
        {
            if(numbers == nullptr && length < 2)
                return 0;

            int min = numbers[0];
            int maxDiff = numbers[1] - min;

            for(int i = 2; i < length; ++i)
            {
                if(numbers[i - 1] < min)
                    min = numbers[i - 1];

                int currentDiff = numbers[i] - min;
                if(currentDiff > maxDiff)
                    maxDiff = currentDiff;
            }

            return maxDiff;
        }

        // ==================== Test Code ====================
        void Test(const char* testName, const int* numbers, unsigned int length, int expected)
        {
            if(testName != nullptr)
                printf("%s begins: ", testName);

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

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

        // &#x4EF7;&#x683C;&#x9012;&#x589E;
        void Test2()
        {
            int numbers[] = { 1, 2, 4, 7, 11, 16 };
            Test("Test2", numbers, sizeof(numbers) / sizeof(int), 15);
        }

        // &#x4EF7;&#x683C;&#x9012;&#x51CF;
        void Test3()
        {
            int numbers[] = { 16, 11, 7, 4, 2, 1 };
            Test("Test3", numbers, sizeof(numbers) / sizeof(int), -1);
        }

        // &#x4EF7;&#x683C;&#x5168;&#x90E8;&#x76F8;&#x540C;
        void Test4()
        {
            int numbers[] = { 16, 16, 16, 16, 16 };
            Test("Test4", numbers, sizeof(numbers) / sizeof(int), 0);
        }

        void Test5()
        {
            int numbers[] = { 9, 11, 5, 7, 16, 1, 4, 2 };
            Test("Test5", numbers, sizeof(numbers) / sizeof(int), 11);
        }

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

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

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

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

            return 0;
        }
</cstdio>

64. 面试题64:求1+2+…+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;64&#xFF1A;&#x6C42;1+2+&#x2026;+n
        // &#x9898;&#x76EE;&#xFF1A;&#x6C42;1+2+&#x2026;+n&#xFF0C;&#x8981;&#x6C42;&#x4E0D;&#x80FD;&#x4F7F;&#x7528;&#x4E58;&#x9664;&#x6CD5;&#x3001;for&#x3001;while&#x3001;if&#x3001;else&#x3001;switch&#x3001;case
        // &#x7B49;&#x5173;&#x952E;&#x5B57;&#x53CA;&#x6761;&#x4EF6;&#x5224;&#x65AD;&#x8BED;&#x53E5;&#xFF08;A?B:C&#xFF09;&#x3002;

        #include <cstdio>

        // ====================&#x65B9;&#x6CD5;&#x4E00;====================
        class Temp
        {
        public:
            Temp() { ++ N; Sum += N; }

            static void Reset() { N = 0; Sum = 0; }
            static unsigned int GetSum() { return Sum; }

        private:
            static unsigned int N;
            static unsigned int Sum;
        };

        unsigned int Temp::N = 0;
        unsigned int Temp::Sum = 0;

        unsigned int Sum_Solution1(unsigned int n)
        {
            Temp::Reset();

            Temp *a = new Temp[n];
            delete []a;
            a = NULL;

            return Temp::GetSum();
        }

        // ====================&#x65B9;&#x6CD5;&#x4E8C;====================
        class A;
        A* Array[2];

        class A
        {
        public:
            virtual unsigned int Sum (unsigned int n)
            {
                return 0;
            }
        };

        class B: public A
        {
        public:
            virtual unsigned int Sum (unsigned int n)
            {
                return Array[!!n]->Sum(n-1) + n;
            }
        };

        int Sum_Solution2(int n)
        {
            A a;
            B b;
            Array[0] = &a;
            Array[1] = &b;

            int value = Array[1]->Sum(n);

            return value;
        }

        // ====================&#x65B9;&#x6CD5;&#x4E09;====================
        typedef unsigned int (*fun)(unsigned int);

        unsigned int Solution3_Teminator(unsigned int n)
        {
            return 0;
        }

        unsigned int Sum_Solution3(unsigned int n)
        {
            static fun f[2] = {Solution3_Teminator, Sum_Solution3};
            return n + f[!!n](n - 1);
        }

        // ====================&#x65B9;&#x6CD5;&#x56DB;====================
        template <unsigned int n> struct Sum_Solution4
        {
            enum Value { N = Sum_Solution4<n 1 ->::N + n};
        };

        template <> struct Sum_Solution4<1>
        {
            enum Value { N = 1};
        };

        template <> struct Sum_Solution4<0>
        {
            enum Value { N = 0};
        };

        // ====================&#x6D4B;&#x8BD5;&#x4EE3;&#x7801;====================
        void Test(int n, int expected)
        {
            printf("Test for %d begins:\n", n);

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

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

            if(Sum_Solution3(n) == expected)
                printf("Solution3 passed.\n");
            else
                printf("Solution3 failed.\n");
        }

        void Test1()
        {
            const unsigned int number = 1;
            int expected = 1;
            Test(number, expected);
            if(Sum_Solution4<number>::N == expected)
                printf("Solution4 passed.\n");
            else
                printf("Solution4 failed.\n");
        }

        void Test2()
        {
            const unsigned int number = 5;
            int expected = 15;
            Test(number, expected);
            if(Sum_Solution4<number>::N == expected)
                printf("Solution4 passed.\n");
            else
                printf("Solution4 failed.\n");
        }

        void Test3()
        {
            const unsigned int number = 10;
            int expected = 55;
            Test(number, expected);
            if(Sum_Solution4<number>::N == expected)
                printf("Solution4 passed.\n");
            else
                printf("Solution4 failed.\n");
        }

        void Test4()
        {
            const unsigned int number = 0;
            int expected = 0;
            Test(number, expected);
            if(Sum_Solution4<number>::N == expected)
                printf("Solution4 passed.\n");
            else
                printf("Solution4 failed.\n");
        }

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

            return 0;
        }
</number></number></number></number></0></1></n></unsigned></cstdio>

65. 面试题65:不用加减乘除做加法

        /*******************************************************************
        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;65&#xFF1A;&#x4E0D;&#x7528;&#x52A0;&#x51CF;&#x4E58;&#x9664;&#x505A;&#x52A0;&#x6CD5;
        // &#x9898;&#x76EE;&#xFF1A;&#x5199;&#x4E00;&#x4E2A;&#x51FD;&#x6570;&#xFF0C;&#x6C42;&#x4E24;&#x4E2A;&#x6574;&#x6570;&#x4E4B;&#x548C;&#xFF0C;&#x8981;&#x6C42;&#x5728;&#x51FD;&#x6570;&#x4F53;&#x5185;&#x4E0D;&#x5F97;&#x4F7F;&#x7528;&#xFF0B;&#x3001;&#xFF0D;&#x3001;&#xD7;&#x3001;&#xF7;
        // &#x56DB;&#x5219;&#x8FD0;&#x7B97;&#x7B26;&#x53F7;&#x3002;

        #include <cstdio>

        int Add(int num1, int num2)
        {
            int sum, carry;
            do
            {
                sum = num1 ^ num2;
                carry = (num1 & num2) << 1;

                num1 = sum;
                num2 = carry;
            }
            while(num2 != 0);

            return num1;
        }

        // ====================&#x6D4B;&#x8BD5;&#x4EE3;&#x7801;====================
        void Test(int num1, int num2, int expected)
        {
            int result = Add(num1, num2);
            if(result == expected)
                printf("%d + %d is %d. Passed\n", num1, num2, result);
            else
                printf("%d + %d is %d. FAILED\n", num1, num2, result);
        }

        int main(int argc, char* argv[])
        {
            Test(1, 2, 3);
            Test(111, 899, 1010);

            Test(-1, 2, 1);
            Test(1, -2, -1);

            Test(3, 0, 3);
            Test(0, -4, -4);

            Test(-2, -8, -10);

            return 0;
        }
</cstdio>

68. 面试题68:树中两个结点的最低公共祖先

        /*******************************************************************
        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;68&#xFF1A;&#x6811;&#x4E2D;&#x4E24;&#x4E2A;&#x7ED3;&#x70B9;&#x7684;&#x6700;&#x4F4E;&#x516C;&#x5171;&#x7956;&#x5148;
        // &#x9898;&#x76EE;&#xFF1A;&#x8F93;&#x5165;&#x4E24;&#x4E2A;&#x6811;&#x7ED3;&#x70B9;&#xFF0C;&#x6C42;&#x5B83;&#x4EEC;&#x7684;&#x6700;&#x4F4E;&#x516C;&#x5171;&#x7956;&#x5148;&#x3002;

        #include <cstdio>
        #include "..\Utilities\Tree.h"
        #include <list>

        using namespace std;

        bool GetNodePath(const TreeNode* pRoot, const TreeNode* pNode, list<const treenode*>& path)
        {
            if(pRoot == pNode)
                return true;

            path.push_back(pRoot);

            bool found = false;

            vector<treenode*>::const_iterator i = pRoot->m_vChildren.begin();
            while(!found && i < pRoot->m_vChildren.end())
            {
                found = GetNodePath(*i, pNode, path);
                ++i;
            }

            if(!found)
                path.pop_back();

            return found;
        }

        const TreeNode* GetLastCommonNode
        (
            const list<const treenode*>& path1,
            const list<const treenode*>& path2
        )
        {
            list<const treenode*>::const_iterator iterator1 = path1.begin();
            list<const treenode*>::const_iterator iterator2 = path2.begin();

            const TreeNode* pLast = nullptr;

            while(iterator1 != path1.end() && iterator2 != path2.end())
            {
                if(*iterator1 == *iterator2)
                    pLast = *iterator1;

                iterator1++;
                iterator2++;
            }

            return pLast;
        }

        const TreeNode* GetLastCommonParent(const TreeNode* pRoot, const TreeNode* pNode1, const TreeNode* pNode2)
        {
            if(pRoot == nullptr || pNode1 == nullptr || pNode2 == nullptr)
                return nullptr;

            list<const treenode*> path1;
            GetNodePath(pRoot, pNode1, path1);

            list<const treenode*> path2;
            GetNodePath(pRoot, pNode2, path2);

            return GetLastCommonNode(path1, path2);
        }

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

            const TreeNode* pResult = GetLastCommonParent(pRoot, pNode1, pNode2);

            if((pExpected == nullptr && pResult == nullptr) ||
                (pExpected != nullptr && pResult != nullptr && pResult->m_nValue == pExpected->m_nValue))
                printf("Passed.\n");
            else
                printf("Failed.\n");
        }

        // &#x5F62;&#x72B6;&#x666E;&#x901A;&#x7684;&#x6811;
        //              1
        //            /   \
        //           2     3
        //       /       \
        //      4         5
        //     / \      / |  \
        //    6   7    8  9  10
        void Test1()
        {
            TreeNode* pNode1 = CreateTreeNode(1);
            TreeNode* pNode2 = CreateTreeNode(2);
            TreeNode* pNode3 = CreateTreeNode(3);
            TreeNode* pNode4 = CreateTreeNode(4);
            TreeNode* pNode5 = CreateTreeNode(5);
            TreeNode* pNode6 = CreateTreeNode(6);
            TreeNode* pNode7 = CreateTreeNode(7);
            TreeNode* pNode8 = CreateTreeNode(8);
            TreeNode* pNode9 = CreateTreeNode(9);
            TreeNode* pNode10 = CreateTreeNode(10);

            ConnectTreeNodes(pNode1, pNode2);
            ConnectTreeNodes(pNode1, pNode3);

            ConnectTreeNodes(pNode2, pNode4);
            ConnectTreeNodes(pNode2, pNode5);

            ConnectTreeNodes(pNode4, pNode6);
            ConnectTreeNodes(pNode4, pNode7);

            ConnectTreeNodes(pNode5, pNode8);
            ConnectTreeNodes(pNode5, pNode9);
            ConnectTreeNodes(pNode5, pNode10);

            Test("Test1", pNode1, pNode6, pNode8, pNode2);
        }

        // &#x6811;&#x9000;&#x5316;&#x6210;&#x4E00;&#x4E2A;&#x94FE;&#x8868;
        //               1
        //              /
        //             2
        //            /
        //           3
        //          /
        //         4
        //        /
        //       5
        void Test2()
        {
            TreeNode* pNode1 = CreateTreeNode(1);
            TreeNode* pNode2 = CreateTreeNode(2);
            TreeNode* pNode3 = CreateTreeNode(3);
            TreeNode* pNode4 = CreateTreeNode(4);
            TreeNode* pNode5 = CreateTreeNode(5);

            ConnectTreeNodes(pNode1, pNode2);
            ConnectTreeNodes(pNode2, pNode3);
            ConnectTreeNodes(pNode3, pNode4);
            ConnectTreeNodes(pNode4, pNode5);

            Test("Test2", pNode1, pNode5, pNode4, pNode3);
        }

        // &#x6811;&#x9000;&#x5316;&#x6210;&#x4E00;&#x4E2A;&#x94FE;&#x8868;&#xFF0C;&#x4E00;&#x4E2A;&#x7ED3;&#x70B9;&#x4E0D;&#x5728;&#x6811;&#x4E2D;
        //               1
        //              /
        //             2
        //            /
        //           3
        //          /
        //         4
        //        /
        //       5
        void Test3()

        {
            TreeNode* pNode1 = CreateTreeNode(1);
            TreeNode* pNode2 = CreateTreeNode(2);
            TreeNode* pNode3 = CreateTreeNode(3);
            TreeNode* pNode4 = CreateTreeNode(4);
            TreeNode* pNode5 = CreateTreeNode(5);

            ConnectTreeNodes(pNode1, pNode2);
            ConnectTreeNodes(pNode2, pNode3);
            ConnectTreeNodes(pNode3, pNode4);
            ConnectTreeNodes(pNode4, pNode5);

            TreeNode* pNode6 = CreateTreeNode(6);

            Test("Test3", pNode1, pNode5, pNode6, nullptr);
        }

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

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

            return 0;
        }
</const></const></const></const></const></const></treenode*></const></list></cstdio>

Original: https://www.cnblogs.com/agui125/p/12024940.html
Author: 风御之举
Title: 其他

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

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

(0)

大家都在看

  • 文本编辑命令

    一、vim编辑器 1、vim的三种模式 一般模式(正常模式):以vim打开文件就直接进入到此模式,此模式中可以使用上下左右按键进行移动光标,也可以在此模式下进行文件的复制粘贴删除等…

    Linux 2023年6月6日
    0105
  • docker安装zabbix

    Zabbix 为每个组件都提供了 Docker 镜像 ,作为弹性和自给自足的容器,促使加快部署和更新过程。Zabbix 组件支持 MySQL 和 PostgreSQL 数据库、Ap…

    Linux 2023年6月6日
    081
  • redis研究记录

    redis研究记录 1 概述目前多数的NoSql数据库本质上都是键值对形式,Redis也不例外。作为缓存数据库的一种,和Memcached相比,有以下几种主要的优点:(1)速度上,…

    Linux 2023年5月28日
    072
  • docker:alpine使用logrotate切割日志

    最近在交付项目的时候使用了docker,大家都知道日志是项目定位问题的重要依据,但如果一开始项目本身没有对日志进行合理切割那就会导致长时间运行的项目日志文件大得编辑器打不开的情况。…

    Linux 2023年5月27日
    0110
  • java程序使用ssl证书连接mysql

    bash;gutter:false; 1. 在mysql服务器上生成证书 openssl genrsa 2048 > ca-key.pem openssl req -new …

    Linux 2023年6月7日
    090
  • Redis 基础

    Redis 基础 Redis 定位 – 特性 关系型数据库 特性 非关系型数据库 特性 Redis 特性 Redis 安装 – 启动 – 使用 …

    Linux 2023年6月13日
    0136
  • 使用二手 gopro 做行车记录仪

    背景 自打开了博客以后,一直在写技术说明文,今天打算写点程序以外的东西换换味口。前段时间在某鱼上以 300 元的价格入手了一套完整的 gopro3+ 运动摄像头,带一张 32G S…

    Linux 2023年6月6日
    0240
  • locate-updatedb命令检索不全

    执行updatedb 命令,用于立刻更新locate 命令所必需的数据库文件,但有些文件可能会在检索过程中被过滤掉。 有时候明明存在的文件,用find 命令都能搜得出来,但用loc…

    Linux 2023年6月13日
    081
  • go-结构体内存布局

    方式一:通过 var 声明结构体 在 Go 语言中当一个变量被声明的时候,系统会自动初始化它的默认值,比如 int 被初始化为 0,指针为 nil。 var 声明同样也会为结构体类…

    Linux 2023年6月13日
    0100
  • 使用ipmitool配置ipmi(远程控制卡)

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Linux 2023年6月7日
    087
  • 关于在Python2中使用列表推导式会遇到的问题

    摘自《流畅的Python》第二部分第二章2.2 Python 2.x 中,在列表推导中 for 关键词之后的赋值操作可能会影响列表推导上下文中的同名变量。像下面这个 Python …

    Linux 2023年6月6日
    0103
  • MySQL概述

    数据库 ~存储数据的仓库,数据是有组织的进行存储 ~英文:Database,简称DB 数据库管理系统 ~管理数据库的大型软件 ~英文:DataBase Management Sys…

    Linux 2023年6月7日
    096
  • Python中class内置方法__init__与__new__作用与区别探究

    最近尝试了解Django中ORM实现的原理,发现其用到了metaclass(元类)这一技术,进一步又涉及到Python class中有两个特殊内置方法__init__与__new_…

    Linux 2023年6月6日
    080
  • 聊一聊mycat数据库集群系列之双主双重实现

    最近在梳理数据库集群的相关操作,现在花点时间整理一下关于mysql数据库集群的操作总结,恰好你又在看这一块,供一份参考。本次系列终结大概包括以下内容:多数据库安装、mycat部署安…

    Linux 2023年6月14日
    0107
  • 设计模式——–代理模式

    代理模式:为其他对象提供一种代理以控制对这个对象的访问。 最简单的代理模式,分为三种角色: 抽象主题角色:代理类与被代理共同实现的接口,内部定义了最普通的业务类型。 具体主题角色:…

    Linux 2023年6月7日
    070
  • Ubuntu下安装IDA pro

    由于IDA pro只能装在32位环境下,如果是64位Ubuntu,需要运行如下命令安装32位的必备库。 sudo dpkg –add-architecture i386 sudo…

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