最近的笔试题

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\n",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("内存分配失败!\n");
        return 0;
    }
    (*L)->next=NULL;
    return OK;
}

//单链表的建立
Status Create(LinkList * L,int n)
{
    LinkList P,Q;
    ElemType Elem;
    Q=(*L);
    //printf("请按递增顺序输入元素:\n");
    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("\n");
}

int main()
{
    LinkList L;
    int Number;
    InitLinkList(&L);
    //printf("请输入元素个数:\n");
    scanf("%d",&Number);
    Create(&L,Number);
    //printf("输出链表:\n");
    //Print(&L);
    Locate(&L);
    //printf("输出去掉相同元素后链表:\n");
    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 (‘\n‘==e[strlen(e)-1]) e[strlen(e)-1]=0;
    //printf("%s\n",e);
    for (i=0;e[i]!=‘\0‘;i++) {
        switch (e[i]) {
        case ‘(‘:
        case ‘[‘:
        case ‘{‘:
            Push(s,e[i]);
            break;
        case ‘)‘:
        case ‘]‘:
        case ‘}‘:
            if (StackEmpty(s)) {
                    printf("ERROR\n");
                //printf("%*s右括号多余\n",i+1,"");
                return(ERROR);
            } else Pop(s,&e1);
            if (!Comp(e1,e[i])) {
                printf("ERROR\n");
                //printf("%*s左右匹配出错\n",i+1,"");
                return(ERROR);
            }
        }
    }
    if (!StackEmpty(s)) {
        //printf("%*s左括号多余\n",i,"");
        printf("ERROR\n");
        return(ERROR);
    } else {
        printf("OK\n");
        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("\n");
        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;
}
时间: 2025-01-13 23:32:37

最近的笔试题的相关文章

【转】嵌入式软件工程师经典笔试题

嵌入式软件工程师经典笔试题 > 预处理器(Preprocessor) 1. 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题) #define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL 我在这想看到几件事情: 1). #define 语法的基本知识(例如:不能以分号结束,括号的使用,等等) 2). 懂得预处理器将为你计算常数表达式的值,因此,直接写出你是如何计算一年中 有多少秒而不是计算出实际的值,是更清晰而没有代价的. 3).

腾讯web前端开发工程师笔试题及答案

1. 如何实现事件委托? 首先要知道什么是事件委托. 考虑一个列表,在li的数量非常少的时候,为每一个li添加事件侦听当然不会存在太多性能方面的问题,但是当列表非常的长,长到上百上千甚至上万的时候(当然只是一个解释,实际工作中很少遇到这么多li的情况),为每个li添加事件侦听就会对页面性能产生很大的影响. 就像下面这段代码: <!DOCTYPE HTML><html><head><meta charset="utf-8" /><ti

ThoughtWorks笔试题之Merchant&#39;s Guide To The Galaxy解析

一.背景 在某网站上看到ThoughtWorks在武汉招人,待遇在本地还算不错,就投递了简历.第二天HR就打开电话,基本了解了一下情况(工作环境不错,男人妹子比例:1:1,双休,六险一金,满一年年假15天,病假8天,月薪1W--2W).然后立马收到一封:Coding Assignment的笔试题目.网上搜索了一下,发现这个公司还是挺大的,公司面试流程是出了名的繁杂和苛刻.据说有8轮:电话面试=>笔试=>Homework=>结对编程(中午管饭)=>技术面试=>PM面试=>

java各公司笔试题集1

IBM笔试题 注:IBM笔试题一小时之内完成,题目全部用英文描述,这里用中文表述 一.名词解释 1.Eclipse 2.J2EE 3.EJB 4.Ajax 5.Web service 二.找出以下代码问题 public class test{ public void print(String str){ char[] s=str: } } public class a{ public static void main(String [] args){ puts() } } 三.写出以下输出 pu

腾讯笔试题:满二叉排序树,任给3个子节点,找他们最大的公共父节点

腾讯笔试题出现了和这个类似的题目,没做出来,现在来好好解决这个问题吧,先从基本的开始. 先吐槽一下:感觉算法设计什么的,真的超级难,也许是我头脑太笨,转不过弯来吧,呵呵. 题目是这样的:一棵满二叉排序树,有K层,节点的值依次为 1~2k-1.现在告诉你树的高度是4层,给定你3个节点,比如9,11, 13,那么最大的公共父节点是12. 现在想起来这题我已经想出来一半了呀,但是大概人在紧张的时候大脑会思维短路,跳不出原有的思维陷阱.想法是这样的: 1. 首先是从根节点开始,如果给的三个叶节点的值其中

2017CVTE笔试题

下面是凭记忆整理的2017CVTE校招笔试题,基本上全都是我不会或很模糊的题,为了更好突出重点我以问答题的形式来描述题目. 1. 中序遍历是属于层次遍历.广度优先遍历.深度优先遍历中的哪一种? 答:层次遍历是指一层一层的遍历树中的节点,广度优先遍历是指遍历完它所有的兄弟节点后再开始遍历其孩子节点,因此层次遍历也属于广度优先遍历.深度优先遍历就是顺着节点的孩子节点一直往下搜索,直到没有孩子节点时才开始搜索叶子节点,常见的前序遍历.中序遍历.后序遍历就是属于深度优先遍历. 2. 产生死锁的4个条件,

c++笔试题贪吃蛇问题

贪吃蛇 现在有一个N*M(N,M=100)的方形矩形,在这个矩形的每一个方格上都放有一个随机值,一条可爱的小蛇从矩形的 左上角开始出发,每次移动都只能移动一格,向右或向下,而每到达一格贪吃的小蛇都会吧该位置上的值吃个一干二净,直到到达右下角时停止.而贪吃的小蛇不怕撑死,它只想吃到最多,并输出路径. #include <iostream> #include<string> #include <cstring> #include<vector> #include

多线程关于腾讯笔试题

今天在头条上看到一道据说是腾讯的笔试题,闲来无事,准备验证一下! 题目如下: 有一个变量int a=0:两个线程同时进行+1操作,每个线程加100次,不加锁,最后a的值是()? 根据我的理解答案不唯一,最大是两百,最小是2吧.直接上代码: class MyThread implements Runnable { static volatile long i = 0; public void run() { for (int m = 0; m < 100; m++) { i++; } } }; p

DP - 2016网易杭研笔试题A

2016网易杭研笔试题A Problem's Link ---------------------------------------------------------------------------- Mean: 有一个边长为n的立方体,内部的每一个小立方体内有一个数字.如果取了当前这个小立方体,则小立方体的: 1.上下相邻两层将会消失; 2.前后相邻两列将会消失; 3.左右相邻两个将会消失; 找出一种取法,使得取到的数的sum最大,输出sum. analyse: 现场面试时挂在这题上了

&lt;转&gt;网易2016实习生前端笔试题部分总结

网易2016实习生前端笔试题部分总结 原文地址:http://www.cnblogs.com/venoral/p/5325202.html 这只是部分题,答案为个人观点如有错误欢迎指出,感觉考点都挺基础,但是很注重考细节方面,通过整理也知道自己在CSS3和HTML5,网络知识等方面的不足还是得多学多练多思考.攒rp,希望自己在明天360笔试中能轻松答过~ css 1.多选 //HTML <p>很长的一段文字,很长的一段文字,很长的一段文字,特别长的文字</p> //CSS p{ w