zoukankan      html  css  js  c++  java
  • 最近的笔试题

    1、顺序表的就地逆置 

    编写一个函数,实现顺序表的就地逆置,也就是说利用原表的存储空间将顺序表(a1,a2...an)逆置为(an,an-1...a2,a1)。

    #include <iostream>
    #include <stdio.h>
    #include <stdlib.h>
    using namespace std;
    //线性表的动态顺序存储结构
    typedef int DataType;   /*数据类型*/
    typedef int ElemType;   /*元素类型*/
    
    #define LIST_INIT_SIZE 100  //线性表存储空间的初始分配量
    #define LISTINCREMENT 10    //线性表存储空间的分配增量
    typedef struct
    {
        ElemType *elem; //存储空间基址
        int length;     //当前长度
        int listsize;   //当前分配的存储容量
    }SqList;
    
    void InitList(SqList *L)
    //初始化
    {
        L->elem = (ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));//分配空间
        L->length = 0;                   //空表的长度为0
        L->listsize = LIST_INIT_SIZE;    //初始容量
    }
    
    void CreateList(SqList *L)
    {
        InitList(L);
        int i;
        for(i = 0; ; i ++)
        {
            scanf("%d", &L->elem[i]);
            if(L->elem[i]==-1)
                break;
            L->length++;
        }
    }
    
    void InsertList(SqList *L, int e)
    {
        int i;
        for(i = L->length-1; L->elem[i] > e; i--)               //从顺序表最后一位开始,将所有大于e的元素向后移动
        {
            L->elem[i+1] = L->elem[i];
        }
        L->elem[i] = e;
    
        L->length++;
    }
    
    void ReverseList(SqList *L)
    {
        int i, temp;
        int n = L->length;
    
        for(i = 0; i < n/2; i ++)
        {
            temp = L->elem[i];
            L->elem[i] = L->elem[n-1-i];
            L->elem[n-1-i] = temp;
        }
    }
    void ListTraverse(SqList *L)
    {
        int n = L->length, i;
    
        for(i = 0; i < n-1; i++)
            printf("%d ", L->elem[i]);
        printf("%d
    ",L->elem[n-1]);
    }
    
    int main()
    {
        SqList L;
        CreateList(&L);
        ReverseList(&L);
        ListTraverse(&L);
        return 0;
    }

    2、删除线性表中多余的元素

    #include <iostream>
    #include<stdio.h>
    #include<stdlib.h>
    #define OK 1
    #define ERROR 0
    using namespace std;
    //采用的是线性表,单链表作为存储结构,在每一次的
    //比较是否与之前的元素是否相等,遍历一次链表时间复杂度O(n)
    typedef int ElemType;
    typedef int Status;
    typedef struct Node
    {
        ElemType data;
        struct Node * next;
    }Node,*LinkList;
    
    //单链表的初始化
    Status InitLinkList(LinkList * L)
    {
        (*L)=(LinkList)malloc(sizeof(Node));
        if((*L)==NULL)
        {
            //printf("内存分配失败!
    ");
            return 0;
        }
        (*L)->next=NULL;
        return OK;
    }
    
    //单链表的建立
    Status Create(LinkList * L,int n)
    {
        LinkList P,Q;
        ElemType Elem;
        Q=(*L);
        //printf("请按递增顺序输入元素:
    ");
        for(int i=0;i<n;i++)
        {
            P=(LinkList)malloc(sizeof(Node));
            scanf("%d",&Elem);
            P->data=Elem;
            Q->next=P;
            Q=P;
        }
        P->next=NULL;
        return OK;
    }
    
    //删除结点
    Status Delete(LinkList * L,int Location)
    {
        LinkList Q,P;
        int count=0;
        int k=Location+1;
        Q=(*L);
        P=(*L)->next;
        while(P->next)
        {
            Q=Q->next;
            P=P->next;
            count++;
            if(count==Location)
            {
                Q->next=P->next;
            }
        }
        return OK;
    }
    
    //定位删除结点的位置并删除
    Status Locate(LinkList * L)
    {
        LinkList First,Second;
        int count=1;
        First=(*L)->next;
        Second=(*L)->next->next;
        while(Second)
        {
            if(First->data==Second->data)
            {
                Delete(L,count);
                Second=Second->next;
            }
            else
            {
                count++;
                First=First->next;
                Second=Second->next;
            }
    
        }
        return OK;
    }
    
    void Print(LinkList * L)
    {
        LinkList P;
        P=(*L)->next;
        while(P)
        {
            printf("%d ",P->data);
            P=P->next;
        }
        printf("
    ");
    }
    
    int main()
    {
        LinkList L;
        int Number;
        InitLinkList(&L);
        //printf("请输入元素个数:
    ");
        scanf("%d",&Number);
        Create(&L,Number);
        //printf("输出链表:
    ");
        //Print(&L);
        Locate(&L);
        //printf("输出去掉相同元素后链表:
    ");
        Print(&L);
        return 0;
    }

    3、表达式括号匹配

    #include<stdio.h>
    #include<malloc.h>
    #include<string.h>
    #define STACK_INIT_SIZE 10
    #define STACK_GROW_SIZE 5
    #define ELEMTYPE char
    #define OK 1
    #define ERROR 0
    typedef struct { /*建立一个栈的首结点*/
        ELEMTYPE * base;
        ELEMTYPE * top;
        int stacksize;
    } SpStack;
    int InitStack(SpStack *s) { /*建立空的栈并返回首地址*/
        s->base=((ELEMTYPE*)malloc(STACK_INIT_SIZE*sizeof(ELEMTYPE)));
        if (!s->base) return ERROR;
        s->top=s->base;
        s->stacksize=STACK_INIT_SIZE;
        return OK;
    }
    int StackEmpty(SpStack *s) { /*判断栈是否为空*/
        if (s->top==s->base) return OK;
        else                 return ERROR;
    }
    int Push(SpStack *s,ELEMTYPE e) { /*往栈顶插入元素即进栈*/
        if (s->top-s->base>=s->stacksize) { /*判断是否栈满*/
            s->base=((ELEMTYPE*)realloc(s->base,(s->stacksize+STACK_GROW_SIZE)*sizeof(ELEMTYPE)));
            if (!s->base) return ERROR;
            s->stacksize+=STACK_GROW_SIZE;
            s->top=s->base+s->stacksize;
        }
        *s->top++=e;
        return OK;
    }
    int Pop(SpStack *s,ELEMTYPE *e) { /*让栈顶元素依次输出即出栈*/
        if (StackEmpty(s)) return ERROR;
        *e=*(--s->top);
        return OK;
    }
    int Comp(ELEMTYPE a,ELEMTYPE b) {
        if ((a=='('&&b!=')')
          ||(a=='['&&b!=']')
          ||(a=='{'&&b!='}')) {
            return ERROR;
        } else return OK;
    }
    int Count(SpStack *s) {
        ELEMTYPE e[STACK_INIT_SIZE*2];
        ELEMTYPE e1;
        int i;
    
        InitStack(s);
        fgets(e,STACK_INIT_SIZE*2,stdin);
        if ('
    '==e[strlen(e)-1]) e[strlen(e)-1]=0;
        //printf("%s
    ",e);
        for (i=0;e[i]!='';i++) {
            switch (e[i]) {
            case '(':
            case '[':
            case '{':
                Push(s,e[i]);
                break;
            case ')':
            case ']':
            case '}':
                if (StackEmpty(s)) {
                        printf("ERROR
    ");
                    //printf("%*s↖右括号多余
    ",i+1,"");
                    return(ERROR);
                } else Pop(s,&e1);
                if (!Comp(e1,e[i])) {
                    printf("ERROR
    ");
                    //printf("%*s↖左右匹配出错
    ",i+1,"");
                    return(ERROR);
                }
            }
        }
        if (!StackEmpty(s)) {
            //printf("%*s↖左括号多余
    ",i,"");
            printf("ERROR
    ");
            return(ERROR);
        } else {
            printf("OK
    ");
            return(OK);
        }
    }
    int main() {
        SpStack s;
        Count(&s);
        free(s.base);
        return 0;
    }

    4、两个已排序的数组进行合并

    #include <iostream>
    #include <assert.h>
    #include<stdio.h>
    #include<stdlib.h>
    /*
    *Describe:print the elements of the array
    *Data:5/11/2013
    *Author:pjgan
    *Version:1
    *tool:vc++2008
    */
    void Global_printElements(const int *pArray,int Array_Length);
    
    /*
    *Return: true is sorted
    *
    */
    bool Global_isSort(const int  *pArray, int iArrayLeng);
    
    /*
    *Return: is the returlts of the Merge Array_A and Array_B
    */
    void *Global_Merge(const int *Array_A, int Array_A_Length, const int *Array_B, int Array_B_Length);
    
    void Global_printElements(const int *pArray,int Array_Length){
        assert(pArray);
        int i = 0;
        for( ; i < Array_Length; ++i) {
            std::cout<<pArray[i]<<" ";
        }
        std::cout<<std::endl;
    }
    
    bool Global_isSort(const int  *pArray, int iArrayLeng){
        assert(pArray);
        int i = 0;
        int j = 0;
        for( ; i < (iArrayLeng-1); ++i) {
            for( j = ( i + 1); j < iArrayLeng; ++j) {
                if(pArray[i] > pArray[j]) return false;
            }
        }
        return true;
    }
    
    void *Global_Merge(const int *Array_A, int Array_A_Length, const int *Array_B, int Array_B_Length) {
        assert(Array_A && Array_B);
        bool bArrayAisSorted = Global_isSort(Array_A, Array_A_Length);
        bool bArrayBisSorted = Global_isSort(Array_B, Array_B_Length);
        if(bArrayAisSorted && bArrayBisSorted) {
            /*
            * i,j are the index of the Array_A and the Array_B
            */
            int i = 0;
            int j = 0;
    
            int *pStoreMergeArrayData = new int[Array_A_Length + Array_B_Length];
            int  MergeArrayIndex = 0;
            while(i < Array_A_Length && j < Array_B_Length) {
                if(Array_A[i] < Array_B[j]) {
                    pStoreMergeArrayData[MergeArrayIndex++] = Array_A[i++];
                } else {
                    pStoreMergeArrayData[MergeArrayIndex++] = Array_B[j++];
                }
            }
    
            while(i < Array_A_Length) {
                pStoreMergeArrayData[MergeArrayIndex++] = Array_A[i++];
            }
    
            while(j < Array_B_Length) {
                pStoreMergeArrayData[MergeArrayIndex++] = Array_B[j++];
            }
            return pStoreMergeArrayData;
        } else {
            std::cout<<"merge failed"<<std::endl;
            //exit(1);
        }
        return NULL;
    }
    
    int main() {
        int a[] = {1, 2, 3, 5, 8};
        //int a[1005],b[1005],n,m,i1,j1;
        //scanf("%d %d",&n,&m);
        //for(i1=0;i1<n;i1++)
           // scanf("%d",&a[i1]);
        //for(j1=0;j1<m;j1++)
           // scanf("%d",&b[j1]);
        int b[] = {2, 6, 7, 10, 25, 33, 50};
        int *MergeArray = (int *)Global_Merge(a, 5, b, 6);
        Global_printElements(MergeArray, 5+6);
        if(MergeArray != NULL) {
            delete MergeArray;
            MergeArray = NULL;
        }
        return 0;
    }

    5、将一维数组中的元素向右循环移动k次

    输入数据有多组,每组数据由两行组成,第一行是k和n,第二行n个整数的数列,数列中的元素以空格隔开。

    #include <iostream>
    #include<stdio.h>
    #include<stdlib.h>
    #include<malloc.h>
    
    using namespace std;
    
    void fun(int *a,int k,int n)
    { int i,j,m;
      for ( i=0;i<k;i++ ) { m=a[n-1]; for ( j=n-1;j>0;j-- ) a[j]=a[j-1]; a[0]=m; }
    }
    
    int main()
    { int k,n,i;
      int *a;
      while ( 1 )
      { scanf("%d",&n);
        if (n>=0)
          if ( a=(int *)malloc(n*sizeof(int)) )
          {    for ( i=0;i<n;i++ ) scanf("%d",a+i);
                scanf("%d",&k);
            fun(a,k,n);
            for ( i=0;i<n;i++ ) printf("%d ",a[i]); printf("
    ");
            free(a);
          }
      }
    }

    6、相邻最大差值

    题目描述

    请设计一个复杂度为O(n)的算法,计算一个未排序数组中排序后相邻元素的最大差值。 
    给定一个整数数组A和数组的大小n,请返回最大差值。

    #include <iostream>
    #include <vector>
    using namespace std;
    class Gap {
    public:
        int maxGap(vector<int> A, int n) {
            int var_max = A[0], var_min = A[0];
            for(int i = 1; i < n; i++){
                if(var_max < A[i])
                    var_max = A[i];
                if(var_min > A[i])
                    var_min = A[i];
            }
            if(var_max == var_min)
                return 0;
    
            double var_unit = (double)(var_max - var_min)/(double)n;
            // vector<int> bucket[n+1];
            vector<vector<int> > bucket(n+1);
            for(int i = 0; i < n; i++){
                bucket[getIndex(var_unit, A[i], var_min)].push_back(A[i]);
            }
            int res = -1, tmp;
            int index1 = 0, index2 = 1;
            while(index2 < n+1){
                // cout<<"index1: "<<index1<<"|| index2: "<<index2<<endl;
                if(!bucket[index1].empty() && !bucket[index2].empty()){
                    tmp = getMin(bucket[index2]) - getMax(bucket[index1]);
                    index1++, index2++;
                    if(tmp > res)
                        res = tmp;
                }
    
                if(bucket[index1].empty())
                    index1++;
                if(bucket[index2].empty())
                    index2++;
            }
            return res;
        }
        int getIndex(double var_unit, int var, int var_min){
            return ((double)(var-var_min)/var_unit);
        }
        int getMax(vector<int> A){
            int tmp = A[0];
            for(int i = 1; i < A.size(); i++){
                if(tmp < A[i])
                    tmp = A[i];
            }
            return tmp;
        }
        int getMin(vector<int> A){
            int tmp = A[0];
            for(int i = 1; i < A.size(); i++){
                if(tmp > A[i])
                    tmp = A[i];
            }
            return tmp;
        }
    };
    int main()
    {
    
        vector<int> A;
        //3429,6401,8559,1052,4775,6220,3593,2406,4995
        A.push_back(3429), A.push_back(6401), A.push_back(8559), A.push_back(1052), A.push_back(4775);
        A.push_back(6220), A.push_back(3593), A.push_back(2406), A.push_back(4995);
        Gap sorter;
        int res = sorter.maxGap(A, 9);
    
        cout<<res<<endl;
    
        return 0;
    }
  • 相关阅读:
    Leetcode NO.110 Balanced Binary Tree 平衡二叉树
    Leetcode NO.226 Invert Binary Tree 翻转二叉树
    Leetcode NO.215 Kth Largest Element In An Array 数组中的第K个最大元素
    根据特征的浏览器判断
    Cygwin在打开在当前目录
    【转帖】科学对待 健康养猫 打造快乐孕妇
    解决chrome浏览器安装扩展、应用程序一直处在“检查中”的问题
    对【SQL SERVER 分布式事务解决方案】的心得补充
    关于“点击这里继续访问您选择的百度XXX”
    VBA一例:如何保持文本框焦点
  • 原文地址:https://www.cnblogs.com/chengxs/p/5965527.html
Copyright © 2011-2022 走看看