zoukankan      html  css  js  c++  java
  • 剑指Offer第6章 面试中的各项能力

    clip_image002

    #if 0
    int GetFirstK(int* data, int length, int k, int start, int end);
    int GetLastK(int* data, int length, int k, int start, int end);
    
    int GetNumberOfK(int* data, int length, int k) {
        if(data==0||length<=0)
            return 0;
        int first=GetFirstK(data,length,k,0,length-1);
        int last=GetLastK(data,length,k,0,length-1);
        if(first>=0&&last>=0)
            return last-first+1;
        return 0;
    }
    int GetFirstK(int* data, int length, int k, int start, int end){
        if(start>end)
            return -1;
        int mid=(start+end)/2;
        if(data[mid]==k){
            if(mid==0||mid>0&&data[mid-1]!=k)
                return mid;
            end=mid-1;
        }
        else if(data[mid]>k)
            end=mid-1;
        else
            start=mid+1;
        return GetFirstK(data,length,k,start,end);
    }
    int GetLastK(int* data, int length, int k, int start, int end){
        if(start>end)
            return -1;
        int mid=(start+end)/2;
        if(data[mid]==k){
            if(mid==length-1||mid<length-1&&data[mid+1]!=k)
                return mid;
            start=mid+1;
        }
        else if(data[mid]>k)
            end=mid-1;
        else
            start=mid+1;
        return GetLastK(data,length,k,start,end);
    }
    // ====================测试代码====================
    void Test(char* testName, int data[], int length, int k, int expected)
    {
        if(testName != NULL)
            printf("%s begins: ", testName);
    
        int result = GetNumberOfK(data, length, k);
        if(result == expected)
            printf("Passed.\n");
        else
            printf("Failed.\n");
    }
    
    // 查找的数字出现在数组的中间
    void Test1()
    {
        int data[] = {1, 2, 3, 3, 3, 3, 4, 5};
        Test("Test1", data, sizeof(data) / sizeof(int), 3, 4);
    }
    
    // 查找的数组出现在数组的开头
    void Test2()
    {
        int data[] = {3, 3, 3, 3, 4, 5};
        Test("Test2", data, sizeof(data) / sizeof(int), 3, 4);
    }
    
    // 查找的数组出现在数组的结尾
    void Test3()
    {
        int data[] = {1, 2, 3, 3, 3, 3};
        Test("Test3", data, sizeof(data) / sizeof(int), 3, 4);
    }
    
    // 查找的数字不存在
    void Test4()
    {
        int data[] = {1, 3, 3, 3, 3, 4, 5};
        Test("Test4", data, sizeof(data) / sizeof(int), 2, 0);
    }
    
    // 查找的数字比第一个数字还小,不存在
    void Test5()
    {
        int data[] = {1, 3, 3, 3, 3, 4, 5};
        Test("Test5", data, sizeof(data) / sizeof(int), 0, 0);
    }
    
    // 查找的数字比最后一个数字还大,不存在
    void Test6()
    {
        int data[] = {1, 3, 3, 3, 3, 4, 5};
        Test("Test6", data, sizeof(data) / sizeof(int), 6, 0);
    }
    
    // 数组中的数字从头到尾都是查找的数字
    void Test7()
    {
        int data[] = {3, 3, 3, 3};
        Test("Test7", data, sizeof(data) / sizeof(int), 3, 4);
    }
    
    // 数组中的数字从头到尾只有一个重复的数字,不是查找的数字
    void Test8()
    {
        int data[] = {3, 3, 3, 3};
        Test("Test8", data, sizeof(data) / sizeof(int), 4, 0);
    }
    
    // 数组中只有一个数字,是查找的数字
    void Test9()
    {
        int data[] = {3};
        Test("Test9", data, sizeof(data) / sizeof(int), 3, 1);
    }
    
    // 数组中只有一个数字,不是查找的数字
    void Test10()
    {
        int data[] = {3};
        Test("Test10", data, sizeof(data) / sizeof(int), 4, 0);
    }
    
    // 鲁棒性测试,数组空指针
    void Test11()
    {
        Test("Test11", NULL, 0, 0, 0);
    }
    
    int main(int argc, char* argv[])
    {
        Test1();
        Test2();
        Test3();
        Test4();
        Test5();
        Test6();
        Test7();
        Test8();
        Test9();
        Test10();
        Test11();
    
        return 0;
    }
    #endif

    clip_image004

    #if 0
    int TreeDepth(BinaryTreeNode* pRoot)
    {
        if(pRoot == NULL)
            return 0;
    
        int nLeft = TreeDepth(pRoot->m_pLeft);
        int nRight = TreeDepth(pRoot->m_pRight);
    
        return (nLeft > nRight) ? (nLeft + 1) : (nRight + 1);
    }
    
    // ====================测试代码====================
    void Test(BinaryTreeNode* pRoot, int expected)
    {
        int result = TreeDepth(pRoot);
        if(expected == result)
            printf("Test passed.\n");
        else
            printf("Test failed.\n");
    }
    
    //            1
    //         /      \
    //        2        3
    //       /\         \
    //      4  5         6
    //        /
    //       7
    void Test1()
    {
        printf("Test1 begins.\n");
    
        BinaryTreeNode* pNode1 = CreateBinaryTreeNode(1);
        BinaryTreeNode* pNode2 = CreateBinaryTreeNode(2);
        BinaryTreeNode* pNode3 = CreateBinaryTreeNode(3);
        BinaryTreeNode* pNode4 = CreateBinaryTreeNode(4);
        BinaryTreeNode* pNode5 = CreateBinaryTreeNode(5);
        BinaryTreeNode* pNode6 = CreateBinaryTreeNode(6);
        BinaryTreeNode* pNode7 = CreateBinaryTreeNode(7);
    
        ConnectTreeNodes(pNode1, pNode2, pNode3);
        ConnectTreeNodes(pNode2, pNode4, pNode5);
        ConnectTreeNodes(pNode3, NULL, pNode6);
        ConnectTreeNodes(pNode5, pNode7, NULL);
    
        Test(pNode1, 4);
    
        DestroyTree(pNode1);
    }
    
    //               1
    //              /
    //             2
    //            /
    //           3
    //          /
    //         4
    //        /
    //       5
    void Test2()
    {
        printf("Test2 begins.\n");
    
        BinaryTreeNode* pNode1 = CreateBinaryTreeNode(1);
        BinaryTreeNode* pNode2 = CreateBinaryTreeNode(2);
        BinaryTreeNode* pNode3 = CreateBinaryTreeNode(3);
        BinaryTreeNode* pNode4 = CreateBinaryTreeNode(4);
        BinaryTreeNode* pNode5 = CreateBinaryTreeNode(5);
    
        ConnectTreeNodes(pNode1, pNode2, NULL);
        ConnectTreeNodes(pNode2, pNode3, NULL);
        ConnectTreeNodes(pNode3, pNode4, NULL);
        ConnectTreeNodes(pNode4, pNode5, NULL);
    
        Test(pNode1, 5);
    
        DestroyTree(pNode1);
    }
    
    // 1
    //  \
    //   2
    //    \
    //     3
    //      \
    //       4
    //        \
    //         5
    void Test3()
    {
        printf("Test3 begins.\n");
    
        BinaryTreeNode* pNode1 = CreateBinaryTreeNode(1);
        BinaryTreeNode* pNode2 = CreateBinaryTreeNode(2);
        BinaryTreeNode* pNode3 = CreateBinaryTreeNode(3);
        BinaryTreeNode* pNode4 = CreateBinaryTreeNode(4);
        BinaryTreeNode* pNode5 = CreateBinaryTreeNode(5);
    
        ConnectTreeNodes(pNode1, NULL, pNode2);
        ConnectTreeNodes(pNode2, NULL, pNode3);
        ConnectTreeNodes(pNode3, NULL, pNode4);
        ConnectTreeNodes(pNode4, NULL, pNode5);
    
        Test(pNode1, 5);
    
        DestroyTree(pNode1);
    }
    
    // 树中只有1个结点
    void Test4()
    {
        printf("Test4 begins.\n");
    
        BinaryTreeNode* pNode1 = CreateBinaryTreeNode(1);
        Test(pNode1, 1);
    
        DestroyTree(pNode1);
    }
    
    // 树中没有结点
    void Test5()
    {
        printf("Test5 begins.\n");
    
        Test(NULL, 0);
    }
    
    int main(int argc, char* argv[])
    {
        Test1();
        Test2();
        Test3();
        Test4();
        Test5();
    
        return 0;
    }
    
    
    #endif

    clip_image006

    #if 0
    // ====================方法1====================
    int TreeDepth(BinaryTreeNode* pRoot){
        if(pRoot==0)
            return 0;
        int left=TreeDepth(pRoot->m_pLeft);
        int right=TreeDepth(pRoot->m_pRight);
        return (left>right?left:right)+1;
    }
    bool IsBalanced_Solution1(BinaryTreeNode* pRoot){
        if(pRoot==0)
            return true;
        int left=TreeDepth(pRoot->m_pLeft),
            right=TreeDepth(pRoot->m_pRight);
        int diff=left-right;
        if(diff>1||diff<-1)
            return false;
        return IsBalanced_Solution1(pRoot->m_pLeft)&&
            IsBalanced_Solution1(pRoot->m_pRight);
    }
    
    // ====================方法2====================
    bool IsBalanced(BinaryTreeNode* pRoot, int* pDepth);
    
    bool IsBalanced_Solution2(BinaryTreeNode* pRoot) {
        int depth=0;
        return IsBalanced(pRoot,&depth);
    }
    bool IsBalanced(BinaryTreeNode* pRoot, int* pDepth){
        if(pRoot==0){
            *pDepth=0;
            return true;
        }
        int left=0,right=0;
        if(IsBalanced(pRoot->m_pLeft,&left)&&
                IsBalanced(pRoot->m_pRight,&right)){
            int diff=left-right;
            if(diff<=1&&diff>=-1){
                *pDepth=(left>right?left:right)+1;
                return true;
            }
        }
        return false;
    }
    // ====================测试代码====================
    void Test(char* testName, BinaryTreeNode* pRoot, bool expected)
    {
        if(testName != NULL)
            printf("%s begins:\n", testName);
    
        printf("Solution1 begins: ");
        if(IsBalanced_Solution1(pRoot) == expected)
            printf("Passed.\n");
        else
            printf("Failed.\n");
    
        printf("Solution2 begins: ");
        if(IsBalanced_Solution2(pRoot) == expected)
            printf("Passed.\n");
        else
            printf("Failed.\n");
    }
    
    // 完全二叉树
    //             1
    //         /      \
    //        2        3
    //       /\       / \
    //      4  5     6   7
    void Test1()
    {
        BinaryTreeNode* pNode1 = CreateBinaryTreeNode(1);
        BinaryTreeNode* pNode2 = CreateBinaryTreeNode(2);
        BinaryTreeNode* pNode3 = CreateBinaryTreeNode(3);
        BinaryTreeNode* pNode4 = CreateBinaryTreeNode(4);
        BinaryTreeNode* pNode5 = CreateBinaryTreeNode(5);
        BinaryTreeNode* pNode6 = CreateBinaryTreeNode(6);
        BinaryTreeNode* pNode7 = CreateBinaryTreeNode(7);
    
        ConnectTreeNodes(pNode1, pNode2, pNode3);
        ConnectTreeNodes(pNode2, pNode4, pNode5);
        ConnectTreeNodes(pNode3, pNode6, pNode7);
    
        Test("Test1", pNode1, true);
    
        DestroyTree(pNode1);
    }
    
    // 不是完全二叉树,但是平衡二叉树
    //             1
    //         /      \
    //        2        3
    //       /\         \
    //      4  5         6
    //        /
    //       7
    void Test2()
    {
        BinaryTreeNode* pNode1 = CreateBinaryTreeNode(1);
        BinaryTreeNode* pNode2 = CreateBinaryTreeNode(2);
        BinaryTreeNode* pNode3 = CreateBinaryTreeNode(3);
        BinaryTreeNode* pNode4 = CreateBinaryTreeNode(4);
        BinaryTreeNode* pNode5 = CreateBinaryTreeNode(5);
        BinaryTreeNode* pNode6 = CreateBinaryTreeNode(6);
        BinaryTreeNode* pNode7 = CreateBinaryTreeNode(7);
    
        ConnectTreeNodes(pNode1, pNode2, pNode3);
        ConnectTreeNodes(pNode2, pNode4, pNode5);
        ConnectTreeNodes(pNode3, NULL, pNode6);
        ConnectTreeNodes(pNode5, pNode7, NULL);
    
        Test("Test2", pNode1, true);
    
        DestroyTree(pNode1);
    }
    
    // 不是平衡二叉树
    //             1
    //         /      \
    //        2        3
    //       /\         
    //      4  5        
    //        /
    //       6
    void Test3()
    {
        BinaryTreeNode* pNode1 = CreateBinaryTreeNode(1);
        BinaryTreeNode* pNode2 = CreateBinaryTreeNode(2);
        BinaryTreeNode* pNode3 = CreateBinaryTreeNode(3);
        BinaryTreeNode* pNode4 = CreateBinaryTreeNode(4);
        BinaryTreeNode* pNode5 = CreateBinaryTreeNode(5);
        BinaryTreeNode* pNode6 = CreateBinaryTreeNode(6);
    
        ConnectTreeNodes(pNode1, pNode2, pNode3);
        ConnectTreeNodes(pNode2, pNode4, pNode5);
        ConnectTreeNodes(pNode5, pNode6, NULL);
    
        Test("Test3", pNode1, false);
    
        DestroyTree(pNode1);
    }
    
    
    //               1
    //              /
    //             2
    //            /
    //           3
    //          /
    //         4
    //        /
    //       5
    void Test4()
    {
        BinaryTreeNode* pNode1 = CreateBinaryTreeNode(1);
        BinaryTreeNode* pNode2 = CreateBinaryTreeNode(2);
        BinaryTreeNode* pNode3 = CreateBinaryTreeNode(3);
        BinaryTreeNode* pNode4 = CreateBinaryTreeNode(4);
        BinaryTreeNode* pNode5 = CreateBinaryTreeNode(5);
    
        ConnectTreeNodes(pNode1, pNode2, NULL);
        ConnectTreeNodes(pNode2, pNode3, NULL);
        ConnectTreeNodes(pNode3, pNode4, NULL);
        ConnectTreeNodes(pNode4, pNode5, NULL);
    
        Test("Test4", pNode1, false);
    
        DestroyTree(pNode1);
    }
    
    // 1
    //  \
    //   2
    //    \
    //     3
    //      \
    //       4
    //        \
    //         5
    void Test5()
    {
        BinaryTreeNode* pNode1 = CreateBinaryTreeNode(1);
        BinaryTreeNode* pNode2 = CreateBinaryTreeNode(2);
        BinaryTreeNode* pNode3 = CreateBinaryTreeNode(3);
        BinaryTreeNode* pNode4 = CreateBinaryTreeNode(4);
        BinaryTreeNode* pNode5 = CreateBinaryTreeNode(5);
    
        ConnectTreeNodes(pNode1, NULL, pNode2);
        ConnectTreeNodes(pNode2, NULL, pNode3);
        ConnectTreeNodes(pNode3, NULL, pNode4);
        ConnectTreeNodes(pNode4, NULL, pNode5);
    
        Test("Test5", pNode1, false);
    
        DestroyTree(pNode1);
    }
    
    // 树中只有1个结点
    void Test6()
    {
        BinaryTreeNode* pNode1 = CreateBinaryTreeNode(1);
        Test("Test6", pNode1, true);
    
        DestroyTree(pNode1);
    }
    
    // 树中没有结点
    void Test7()
    {
        Test("Test7", NULL, true);
    }
    
    int main(int argc, char* argv[])
    {
        Test1();
        Test2();
        Test3();
        Test4();
        Test5();
        Test6();
        Test7();
    
        return 0;
    }
    
    
    #endif

    clip_image008

    代码如下:

    #if 0
    unsigned int FindFirstBitIs1(int num);
    bool IsBit1(int num, unsigned int indexBit);
    
    void FindNumsAppearOnce(int data[], int length, int* num1, int* num2){
        if(data==0||length<=0)
            return;
        unsigned int s=0;
        for(int i=0;i<length;i++)
            s^=data[i];
       unsigned int pos=FindFirstBitIs1(s);
        *num1=0,*num2=0;
        for(int i=0;i<length;i++){
            if(IsBit1(data[i],pos))
                *num1^=data[i];
            else
                *num2^=data[i];
        }
    }
    unsigned int FindFirstBitIs1(int num){
        int pos=0;
        while(pos<sizeof(int)*4){
            if(num&(0x1<<pos))
                break;
            else
                pos++;
        }
        return pos;
    }
    bool IsBit1(int num,unsigned int indexBit){
        return num&(0x1<<indexBit);
    }
    // ====================测试代码====================
    void Test(char* testName, int data[], int length, int expected1, int expected2)
    {
        if(testName != NULL)
            printf("%s begins: ", testName);
    
        int result1, result2;
        FindNumsAppearOnce(data, length, &result1, &result2);
    
        if((expected1 == result1 && expected2 == result2) ||
            (expected2 == result1 && expected1 == result2))
            printf("Passed.\n\n");
        else
            printf("Failed.\n\n");
    }
    
    void Test1()
    {
        int data[] = {2, 4, 3, 6, 3, 2, 5, 5};
        Test("Test1", data, sizeof(data) / sizeof(int), 4, 6);
    }
    
    void Test2()
    {
        int data[] = {4, 6};
        Test("Test2", data, sizeof(data) / sizeof(int), 4, 6);
    }
    
    void Test3()
    {
        int data[] = {4, 6, 1, 1, 1, 1};
        Test("Test3", data, sizeof(data) / sizeof(int), 4, 6);
    }
    
    int main(int argc, char* argv[])
    {
        Test1();
        Test2();
        Test3();
    
        return 0;
    }
    
    
    #endif

    clip_image010

    代码如下:

    #if 0
    bool FindNumbersWithSum(int data[], int length, int sum, 
                            int* num1, int* num2) {
        if(data==0||length<=0||num1==0||num2==0)
            return false;
        int i=0,j=length-1;
        int s;
        while(i<j){
            s=data[i]+data[j];
            if(s==sum){
                *num1=data[i];
                *num2=data[j];
                return true;
            }
            else if(s<sum){
                i++;
            }
            else
                j--;
        }
        return false;
    }
    // ====================测试代码====================
    void Test(char* testName, int data[], int length, int sum, bool expectedReturn)
    {
        if(testName != NULL)
            printf("%s begins: ", testName);
        
        int num1, num2;
        int result = FindNumbersWithSum(data, length, sum, &num1, &num2);
        if(result == expectedReturn)
        {
            if(result)
            {
                if(num1 + num2 == sum)
                    printf("Passed. \n");
                else
                    printf("Failed. \n");
            }
            else
                printf("Passed. \n");
        }
        else
            printf("Failed. \n");
    }
    
    // 存在和为s的两个数字,这两个数字位于数组的中间
    void Test1()
    {
        int data[] = {1, 2, 4, 7, 11, 15};
        Test("Test1", data, sizeof(data) / sizeof(int), 15, true);
    }
    
    // 存在和为s的两个数字,这两个数字位于数组的两段
    void Test2()
    {
        int data[] = {1, 2, 4, 7, 11, 16};
        Test("Test2", data, sizeof(data) / sizeof(int), 17, true);
    }
    
    // 不存在和为s的两个数字
    void Test3()
    {
        int data[] = {1, 2, 4, 7, 11, 16};
        Test("Test3", data, sizeof(data) / sizeof(int), 10, false);
    }
    
    // 鲁棒性测试
    void Test4()
    {
        Test("Test4", NULL, 0, 0, false);
    }
    
    int main(int argc, char* argv[])
    {
        Test1();
        Test2();
        Test3();
        Test4();
    
        return 0;
    }
    
    
    #endif

    clip_image012

    代码如下:

    #if 0
    void PrintContinuousSequence(int small, int big);
    
    void FindContinuousSequence(int sum){
        if(sum<3)
            return;
        int t1=1,t2=2;
        int mid=(1+sum)/2;
        int curSum=t1+t2;
        while(t1<mid){
            if(curSum==sum) {
                PrintContinuousSequence(t1,t2);
                curSum-=t1;
                t1++;
            }
            else if(curSum<sum) {
                t2++;
                curSum+=t2;
            }
            else {
                curSum-=t1;
                t1++;
            }
        }
    }
    void PrintContinuousSequence(int small, int big)
    {
        for(int i = small; i <= big; ++ i)
            printf("%d ", i);
    
        printf("\n");
    }
    
    // ====================测试代码====================
    void Test(char* testName, int sum)
    {
        if(testName != NULL)
            printf("%s for %d begins: \n", testName, sum);
    
        FindContinuousSequence(sum);
    }
    
    int main(int argc, char* argv[])
    {
        Test("test1", 1);
        Test("test2", 3);
        Test("test3", 4);
        Test("test4", 9);
        Test("test5", 15);
        Test("test6", 100);
    
        return 0;
    }
    
    
    #endif

    clip_image014

    代码如下:

    void Reverse(char*s,char*t){
        while(s<t){
            swap(*s,*t);
            s++,t--;
        }
    }
    #if 0
    void ReverseSentence(char *str){
        if(str==0)
            return ;
        char *s,*t;
        int len=strlen(str);
        printf("%s\n",str);
        Reverse(str,str+len-1);
        printf("%s\n",str);
        s=t=str;
        while(*s!='\0'){
            if(*s==' '){
                s++,t++;
            }
            else if(*t==' '||*t=='\0'){
                Reverse(s,--t);
                s=++t;
            }
            else
                t++;
        }
    }
    // ====================测试代码====================
    void Test(char* testName, char* input, char* expectedResult)
    {
        if(testName != NULL)
            printf("%s begins: ", testName);
    
        ReverseSentence(input);
    
        if((input == NULL && expectedResult == NULL)
            || (input != NULL && strcmp(input, expectedResult) == 0))
            printf("Passed.\n\n");
        else
            printf("Failed.\n\n");
    }
    
    // 功能测试,句子中有多个单词
    void Test1()
    {
        char input[] = "I am a student.";
        char expected[] = "student. a am I";
    
        Test("Test1", input, expected);
    }
    
    // 功能测试,句子中只有一个单词
    void Test2()
    {
        char input[] = "Wonderful";
        char expected[] = "Wonderful";
    
        Test("Test2", input, expected);
    }
    
    // 鲁棒性测试
    void Test3()
    {
        Test("Test3", NULL, NULL);
    }
    
    // 边界值测试,测试空字符串
    void Test4()
    {
        Test("Test4", "", "");
    }
    
    // 边界值测试,字符串中只有空格
    void Test5()
    {
        char input[] = "   ";
        char expected[] = "   ";
        Test("Test5", input, expected);
    }
    
    int main(int argc, char* argv[])
    {
        Test1();
        Test2();
        Test3();
        Test4();
        Test5();
    
        return 0;
    }
    #endif

    clip_image016

    代码如下:

    #if 0
    
    char* LeftRotateString(char* pStr, int n)
    {
        if(pStr != NULL)
        {
            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;
    
                // 翻转字符串的前面n个字符
                Reverse(pFirstStart, pFirstEnd);
                // 翻转字符串的后面部分
                Reverse(pSecondStart, pSecondEnd);
                // 翻转整个字符串
                Reverse(pFirstStart, pSecondEnd);
            }
        }
    
        return pStr;
    }
    
    // ====================测试代码====================
    void Test(char* testName, char* input, int num, char* expectedResult)
    {
        if(testName != NULL)
            printf("%s begins: ", testName);
    
        char* result = LeftRotateString(input, num);
    
        if((input == NULL && expectedResult == NULL)
            || (input != NULL && strcmp(result, expectedResult) == 0))
            printf("Passed.\n\n");
        else
            printf("Failed.\n\n");
    }
    
    // 功能测试
    void Test1()
    {
        char input[] = "abcdefg";
        char expected[] = "cdefgab";
    
        Test("Test1", input, 2, expected);
    }
    
    // 边界值测试
    void Test2()
    {
        char input[] = "abcdefg";
        char expected[] = "bcdefga";
    
        Test("Test2", input, 1, expected);
    }
    
    // 边界值测试
    void Test3()
    {
        char input[] = "abcdefg";
        char expected[] = "gabcdef";
    
        Test("Test3", input, 6, expected);
    }
    
    // 鲁棒性测试
    void Test4()
    {
        Test("Test4", NULL, 6, NULL);
    }
    
    // 鲁棒性测试
    void Test5()
    {
        char input[] = "abcdefg";
        char expected[] = "abcdefg";
    
        Test("Test5", input, 0, expected);
    }
    
    // 鲁棒性测试
    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;
    }
    
    #endif

    clip_image018

    #if 0
    // ====================方法一====================
    void Probability(int n, int current, int sum, int* pProbabilities);
    
    void PrintProbability_Solution1(int n) {
        if(n<=0)
            return;
        int maxSum=6*n;
    //    int sz=6*n-n+1;
        int *pro=new int[maxSum+1];
        for(int i=1;i<=maxSum;i++)
            pro[i]=0;
    
        for(int i=1;i<=6;i++)
            Probability(n,n,i,pro);
        
        double total=pow((double)6,n);
        for(int i=n;i<=maxSum;i++){
            double p=pro[i]/total;
            printf("%d: %e\n",i,p);
        }
        delete[] pro;
    }
    void Probability(int n,int c,int sum,int *pro){
        if(c==1){
            pro[sum]++;
        }
        else{
            for(int i=1;i<=6;i++)
                Probability(n,c-1,i+sum,pro);
        }
    }
    void PrintProbability_Solution2(int n) {
        if(n<=0)
            return;
        int *pro[2];
        pro[0]=new int[6*n+1];
        pro[1]=new int[6*n+1];
        for(int i=0;i<=6*n;i++)
            pro[0][i]=pro[1][i]=0;
        int flag=0;
        for(int i=1;i<=6;i++)
            pro[flag][i]=1;
        for(int k=2;k<=n;k++){
            for(int i=0;i<k;i++)
                pro[1-flag][i]=0;
            for(int i=k;i<=6*k;i++){
                int cnt=0;
                for(int j=1;j<=i&&j<=6;j++)
                    cnt+=pro[flag][i-j];
                pro[1-flag][i]=cnt;
            }
            flag=1-flag;
        }
        double total=pow((double)6,n);
        for(int i=n;i<=6*n;i++) {
            double p=pro[flag][i]/total;
            printf("%d: %e\n",i,p);
        }
        delete[] pro[0];
        delete[] pro[1];
    }
    // ====================测试代码====================
    void Test(int n)
    {
        printf("Test for %d begins:\n", n);
        
        printf("Test for solution1\n");
        PrintProbability_Solution1(n);
    
        printf("Test for solution2\n");
        PrintProbability_Solution2(n);
    
        printf("\n");
    }
    
    int main(int argc, char* argv[])
    {
        Test(1);
        Test(2);
        Test(3);
        Test(4);
        
        Test(11);
    
        Test(0);
    
        return 0;
    }
    
    #endif

    clip_image020

    代码如下:

    #if 0
    bool IsContinuous(int* a, int n) {
        if(a==0||n<=0)
            return false;
        int cnt_zero=0;
        int gap=0;
        for(int i=0;i<n;i++)
            if(a[i]==0)
                cnt_zero++;
        sort(a,a+n);
        int i=cnt_zero;
        for(;i<n-1;i++){
            if(a[i]==a[i+1])
                return false;
            gap+=a[i+1]-a[i]-1;
        }
        return cnt_zero>=gap;
    }
    // ====================测试代码====================
    void Test(char* testName, int* numbers, int length, bool expected)
    {
        if(testName != NULL)
            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);
    }
    
    // 有对子
    void Test11()
    {
        int numbers[] = {1, 0, 0, 1, 0};
        Test("Test11", numbers, sizeof(numbers) / sizeof(int), false);
    }
    
    // 鲁棒性测试
    void Test12()
    {
        Test("Test12", NULL, 0, false);
    }
    
    int main(int argc, char* argv[])
    {
        Test1();
        Test2();
        Test3();
        Test4();
        Test5();
        Test6();
        Test7();
        Test8();
        Test9();
        Test10();
        Test11();
        Test12();
    
        return 0;
    }
    
    
    #endif

    clip_image022 clip_image024

    clip_image026 clip_image028 clip_image030

    代码如下:

    #if 0
    
    // ====================方法1====================
    int LastRemaining_Solution1(unsigned int n, unsigned int m){
        if(n<1||m<1)
            return -1;
        list<int> lst;
        for(int i=0;i<n;i++)
            lst.push_back(i);
        list<int>::iterator current=lst.begin();
        list<int>::iterator next;
        while(lst.size()>1){
            for(int i=1;i<m;i++){
                ++current;
                if(current==lst.end())
                    current=lst.begin();
            }
            next=++current;
            if(next==lst.end())
                next=lst.begin();
            --current;
            lst.erase(current);
            current=next;
        }
        return *current;
    }
    // ====================方法2====================
    int LastRemaining_Solution2(unsigned int n, unsigned int m){
        if(n<1||m<1)
            return -1;
        int last=0;
        for(int i=2;i<=n;i++)
            last=(last+m)%i;
        return last;
    }
    // ====================测试代码====================
    void Test(char* testName, unsigned int n, unsigned int m, int expected)
    {
        if(testName != NULL)
            printf("%s begins: \n", testName);
    
        if(LastRemaining_Solution1(n, m) == expected)
            printf("Solution1 passed.\n");
        else
            printf("Solution1 failed.\n");
    
        if(LastRemaining_Solution2(n, m) == expected)
            printf("Solution2 passed.\n");
        else
            printf("Solution2 failed.\n");
    
        printf("\n");
    }
    
    void Test1()
    {
        Test("Test1", 5, 3, 3);
    }
    
    void Test2()
    {
        Test("Test2", 5, 2, 2);
    }
    
    void Test3()
    {
        Test("Test3", 6, 7, 4);
    }
    
    void Test4()
    {
        Test("Test4", 6, 6, 3);
    }
    
    void Test5()
    {
        Test("Test5", 0, 0, -1);
    }
    
    void Test6()
    {
        Test("Test6", 4000, 997, 1027);
    }
    
    int main(int argc, char* argv[])
    {
        Test1();
        Test2();
        Test3();
        Test4();
        Test5();
        Test6();
    
        return 0;
    }
    
    #endif

    clip_image032

    clip_image034 clip_image036 clip_image038 clip_image040

    代码如下:

    #if 0
    class A{
        public:
            A(){
                ++N;
                sum+=N;
            }
            static void Reset(){N=0;sum=0;}
            static int GetSum(){
                return sum;
            }
        public:
            static int N;
            static int sum;
    };
    int A::N=0;
    int A::sum=0;
    
    int Sum_Solution1(int n) {
        A::Reset();
        A *pa=new A[n];
        delete[] pa;
        return A::GetSum();
    }
    class C1;
    C1* arr[2];
    class C1{
        public:
        virtual int sum(int n){
            return 0;
        }
    };
    class C2:public C1{
        public:
            int sum(int n){
                return arr[!!n]->sum(n-1)+n;
            }
    };
    int Sum_Solution2(int n) {
        C1 cc1;
        C2 cc2;
        arr[0]=&cc1;
        arr[1]=&cc2;
        return arr[1]->sum(n);
    }
    typedef int (*fun)(int);
    int f1(int n){
        return 0;
    }
    int Sum_Solution3(int n) {
        static fun f[2]={f1,Sum_Solution3};
        return n+f[!!n](n-1);
    }
    template <int n> 
    struct Sum_Solution4 {
        enum {N=Sum_Solution4<n-1>::N+n};
    };
    template <>
    struct Sum_Solution4<1>{
        enum {N=1};
    };
    template <>
    struct Sum_Solution4<0>{
        enum {N=0};
    };
    // ====================测试代码====================
    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;
    }
    
    #endif

    clip_image042

    代码如下:

    #if 0
    int Add(int num1, int num2) {
        int sum;
        int carry;
        do{
            sum=num1^num2;
            carry=(num1&num2)<<1;
            num1=sum;
            num2=carry;
        }while(num2!=0);
        return sum;
    }
    // ====================测试代码====================
    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);
    }
    
    
    #endif

    clip_image044

    clip_image046 clip_image048 clip_image050

    代码如下:

    #if 0
    
    // ====================方法一====================
    class SealedClass1
    {
    public:
        static SealedClass1* GetInstance() 
        {
            return new SealedClass1();
        }
     
        static void DeleteInstance( SealedClass1* pInstance)
        {
            delete pInstance;
        }
     
    private:
        SealedClass1() {}
        ~SealedClass1() {}
    };
    
    // 如果试图从SealedClass1继承出新的类型,
    // 将会导致编译错误。
    /*
    class Try1 : public SealedClass1
    {
    public:
        Try1() {}
        ~Try1() {}
    };
    */
    
    // ====================方法二====================
    template <typename T> class MakeSealed
    {
        friend T;
     
    private:
        MakeSealed() {}
        ~MakeSealed() {}
    };
     
    class SealedClass2 : virtual public MakeSealed<SealedClass2>
    {
    public:
        SealedClass2() {}
        ~SealedClass2() {}
    };
    
    // 如果试图从SealedClass1继承出新的类型,
    // 将会导致编译错误。
    /*
    class Try2 : public SealedClass2
    {
    public:
        Try2() {}
        ~Try2() {}
    };
    */
    
    int main(int argc, char* argv[])
    {
        return 0;
    }
    
    #endif

    面试题49 将字符串转化为整数

    #if 0
    long long StrToIntCore(const char* str, bool minus);
    
    enum Status {kValid = 0, kInvalid};
    int g_nStatus = kValid;
    
    int StrToInt(const char* str)
    {
        g_nStatus = kInvalid;
        long long num = 0;
    
        if(str != NULL && *str != '\0') 
        {
            bool minus = false;
            if(*str == '+')
                str ++;
            else if(*str == '-') 
            {
                str ++;
                minus = true;
            }
    
            if(*str != '\0') 
            {
                num = StrToIntCore(str, minus);
            }
        }
    
        return (int)num;
    }
    
    long long StrToIntCore(const char* digit, bool minus)
    {
        long long num = 0;
    
        while(*digit != '\0') 
        {
            if(*digit >= '0' && *digit <= '9') 
            {
                int flag = minus ? -1 : 1;
                num = num * 10 + flag * (*digit - '0');
    
                if((!minus && num > 0x7FFFFFFF) 
                    || (minus && num < (signed int)0x80000000))
                {
                    num = 0;
                    break;
                }
    
                digit++;
            }
            else 
            {
                num = 0;
                break;
            }
        }
    
        if(*digit == '\0') 
        {
            g_nStatus = kValid;
        }
    
        return num;
    }
    
    // ====================测试代码====================
    void Test(char* string)
    {
        int result = StrToInt(string);
        if(result == 0 && g_nStatus == kInvalid)
            printf("the input %s is invalid.\n", string);
        else
            printf("number for %s is: %d.\n", string, result);
    }
    
    int main(int argc, char* argv[])
    {
        Test(NULL);
    
        Test("");
    
        Test("123");
    
        Test("+123");
        
        Test("-123");
    
        Test("1a33");
    
        Test("+0");
    
        Test("-0");
    
        //有效的最大正整数, 0x7FFFFFFF
        Test("+2147483647");    
    
        Test("-2147483647");
    
        Test("+2147483648");
    
        //有效的最小负整数, 0x80000000
        Test("-2147483648");    
    
        Test("+2147483649");
    
        Test("-2147483649");
    
        Test("+");
    
        Test("-");
    
        return 0;
    }
    
    #endif

    clip_image052

    struct TreeNode 
    {
        int                    m_nValue;    
        std::vector<TreeNode*>    m_vChildren;    
    };
    TreeNode* CreateTreeNode(int value)
    {
        TreeNode* pNode = new TreeNode();
        pNode->m_nValue = value;
    
        return pNode;
    }
    
    void ConnectTreeNodes(TreeNode* pParent, TreeNode* pChild)
    {
        if(pParent != NULL)
        {
            pParent->m_vChildren.push_back(pChild);
        }
    }
    
    void PrintTreeNode(TreeNode* pNode)
    {
        if(pNode != NULL)
        {
            printf("value of this node is: %d.\n", pNode->m_nValue);
    
            printf("its children is as the following:\n");
            std::vector<TreeNode*>::iterator i = pNode->m_vChildren.begin();
            while(i < pNode->m_vChildren.end())
            {
                if(*i != NULL)
                    printf("%d\t", (*i)->m_nValue);
            }
    
            printf("\n");
        }
        else
        {
            printf("this node is null.\n");
        }
    
        printf("\n");
    }
    
    void PrintTree(TreeNode* pRoot)
    {
        PrintTreeNode(pRoot);
    
        if(pRoot != NULL)
        {
            std::vector<TreeNode*>::iterator i = pRoot->m_vChildren.begin();
            while(i < pRoot->m_vChildren.end())
            {
                PrintTree(*i);
                ++i;
            }
        }
    }
    
    void DestroyTree(TreeNode* pRoot)
    {
        if(pRoot != NULL)
        {
            std::vector<TreeNode*>::iterator i = pRoot->m_vChildren.begin();
            while(i < pRoot->m_vChildren.end())
            {
                DestroyTree(*i);
                ++i;
            }
    
            delete pRoot;
        }
    }
    #if 1
    bool GetNodePath(TreeNode* pRoot, TreeNode* pNode, list<TreeNode*>& path)
    {
        if(pRoot == pNode)
            return true;
     
        path.push_back(pRoot);
     
        bool found = false;
    
        vector<TreeNode*>::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;
    }
    
    TreeNode* GetLastCommonNode
    (
        const list<TreeNode*>& path1, 
        const list<TreeNode*>& path2
    )
    {
        list<TreeNode*>::const_iterator iterator1 = path1.begin();
        list<TreeNode*>::const_iterator iterator2 = path2.begin();
        
        TreeNode* pLast = NULL;
     
        while(iterator1 != path1.end() && iterator2 != path2.end())
        {
            if(*iterator1 == *iterator2)
                pLast = *iterator1;
     
            iterator1++;
            iterator2++;
        }
     
        return pLast;
    }
    
    TreeNode* GetLastCommonParent(TreeNode* pRoot, TreeNode* pNode1, TreeNode* pNode2)
    {
        if(pRoot == NULL || pNode1 == NULL || pNode2 == NULL)
            return NULL;
     
        list<TreeNode*> path1;
        GetNodePath(pRoot, pNode1, path1);
     
        list<TreeNode*> path2;
        GetNodePath(pRoot, pNode2, path2);
     
        return GetLastCommonNode(path1, path2);
    }
    
    // ====================测试代码====================
    
    void Test(char* testName, TreeNode* pRoot, TreeNode* pNode1, TreeNode* pNode2, TreeNode* pExpected)
    {
        if(testName != NULL)
            printf("%s begins: \n", testName);
    
        TreeNode* pResult = GetLastCommonParent(pRoot, pNode1, pNode2);
    
        if((pExpected == NULL && pResult == NULL) || 
            (pExpected != NULL && pResult != NULL && pResult->m_nValue == pExpected->m_nValue))
            printf("Passed.\n");
        else
            printf("Failed.\n");
    }
    
    // 形状普通的树
    //              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);
    }
    
    // 树退化成一个链表
    //               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);
    }
    
    // 树退化成一个链表,一个结点不在树中
    //               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, NULL);
    }
    
    // 输入NULL
    void Test4()
    {
        Test("Test4", NULL, NULL, NULL, NULL);
    }
    
    int main(int argc, char* argv[])
    {
        Test1();
        Test2();
        Test3();
        Test4();
    
        return 0;
    }
    
    
    #endif
  • 相关阅读:
    centos安装odoo10及安装问题解决
    crontab实现定时任务
    pycharm发布代码
    centos下安装dblib
    windows安装face_recognition并进行人脸对比
    centos安装nginx1.9
    win10安装fast_client
    WIN10搭建python最新环境
    Linux常见命令
    centos安装python3.7
  • 原文地址:https://www.cnblogs.com/xkfz007/p/2758257.html
Copyright © 2011-2022 走看看