• 合并两个数组


    #include <iostream>
    using namespace std;
    int sortedInsert(int A[],int lenA,int B[],int lenB)
    {
        if(B == NULL)
            return lenA;
        int len = lenA + lenB;
        int indexNew = len-1;
        int indexA = lenA-1;
        int indexB = lenB-1;
        while( indexA>=0 && indexB>=0 )
        {
            if(A[indexA] > B[indexB])
            {
                A[indexNew] = A[indexA--];
                
            }else{
                A[indexNew] = B[indexB--];    
            }
        //    printf("%d 
    ",A[indexNew]);
            //printf("here lenA = %d,lenB = %d
    ",indexA,indexB) ;
            indexNew --;
        }
        //下面处理剩余的那部分;
        //printf("here lenA = %d,lenB = %d
    ",indexA,indexB) ;
        while(indexA>=0)
        {
            //
            A[indexNew] = A[indexA];
            //printf("%d ",A[indexNew]);
            indexNew--; indexA -- ;
        } 
        //printf("OK");
        while(indexB>=0)
        {
            
            A[indexNew] = B[indexB];
            //printf("%d ",A[indexNew]);
            indexNew--; indexB -- ;
        } 
        return lenA+lenB;
    }
    int intCmp(int * A ,int lenA,int * expected ,int lenExpected)
    {
        if(lenA != lenExpected)
            return -1;
        for(int i = 0;i<lenA;i++)
            if(A[i]!=expected[i])
            {
                //printf("%d %d %d
    ",i,A[i],expected[i]);
                return -1;
            }
        return 0;
    }
    void test(char * testNumber,int *A,int lenA,int *B,int lenB,int* expected,int lenExpected)
    {
        lenA = sortedInsert(A,lenA,B,lenB);
        printf("%s ",testNumber); 
        if(intCmp(A,lenA,expected,lenExpected) == 0 )
            printf("passed
    ");
        else
            printf("failed
    ");
    }
    void test1()//B插在A的后头; 
    {
        int A[100]={1,3,5,7,9};
        int B[]={2,4,6,8};
        //sortedInsert(A,5,B,4);
        int expected[]={1,2,3,4,5,6,7,8,9};
        test("test1",A,5,B,sizeof(B)/sizeof(int),expected,sizeof(expected)/sizeof(int));
    } 
    void test2()//B要插在A的前头; 
    {
        int A[100]={6,7,8,9};
        int B[]={1,2,3,4,5};
        //sortedInsert(A,5,B,4);
        int expected[]={1,2,3,4,5,6,7,8,9};
        test("test2",A,4,B,sizeof(B)/sizeof(int),expected,sizeof(expected)/sizeof(int));
    } 
    void test3()//A没有内容 
    {
        int A[100]={};
        int B[]={1,3,5,7,9};
        //sortedInsert(A,5,B,4);
        int expected[]={1,3,5,7,9};
        test("test3",A,0,B,sizeof(B)/sizeof(int),expected,sizeof(expected)/sizeof(int));
    } 
    void test4()//B没有内容 
    {
        int A[100]={1,3,5,7,9};
        int B[]={};
        //sortedInsert(A,5,B,4);
        int expected[]={1,3,5,7,9};
        test("test4",A,5,B,sizeof(B)/sizeof(int),expected,sizeof(expected)/sizeof(int));
    }  
    void test5()//A,B都没有内容 
    {
        int A[100]={};
        int B[]={};
        //sortedInsert(A,5,B,4);
        int expected[]={};
        test("test5",A,0,B,sizeof(B)/sizeof(int),expected,sizeof(expected)/sizeof(int));
    } 
    void test6()//B为空指针 
    {
        int A[100]={1,3,5,7,9};
        int * B = NULL; 
        //sortedInsert(A,5,B,4);
        int expected[]={1,3,5,7,9};
        test("test6",A,5,B,sizeof(B)/sizeof(int),expected,sizeof(expected)/sizeof(int));
    } 
    int main()
    {
        test1();
        test2();
        test3();
        test4();
        test5();
        test6();
        return 0;
    }

     合并两个数组(包括字符串)时,如果从前往后复制每个数字(或字符)需要重复移动数字(或字符)多次,那么我们可以考虑从后往前复制,这样就能减少移动的次数,从而提高效率。

  • 相关阅读:
    用Service充当Domain Object
    Scrum方法回顾
    为什么使用User Story Map
    前端状态管理之状态机
    项目进度管理注意事项
    单元测试遇到的最难的问题
    JS AMD模块的循环依赖
    jupyter notebook常用快捷键
    Jupyter-NoteBook-你应该知道的N个小技巧
    Python之配置日志的几种方式(logging模块)
  • 原文地址:https://www.cnblogs.com/dragonfive/p/4334081.html
Copyright © 2020-2023  润新知