2021届阅文C 方向笔试卷 5/13 实现一个动态调整大小的数组

2021届阅文C 方向笔试卷 企业提供原题01:56:12
5/13
[编程题]实现一个动态调整大小的数组
时间限制:C/C++ 1秒,其他语言2秒

空间限制:C/C++ 256M,其他语言512M

我们知道C++的数组需要在编译时决定大小,但很多时候,我们往往不能提前预估数组的大小,为此我们设计一个动态数组,即:当向数组中添加新元素时,如果数组空间不够,那么自动对数组进行扩容;如果从数组中删除了较多元素,那么也可以自动对数组进行缩容。

请实现一个简化的动态数组,该数组存储整数(int),只提供三个操作:
1. 向数组尾部追加一个新元素,如果空间不够,那么自动扩容,同时要求该追加操作的均摊时间复杂度为O(1):void push(int num);
2. 从数组尾部删除一个元素,如果数组不为空,返回被删除的元素,如果数组为空,返回-1,不执行删除操作。当删除较多元素后,可以对数组进行缩容,但要求从尾部删除元素的操作,均摊时间复杂度为O(1): int pop();
3. 根据数组下标获取对应的整数,如果下标越界,返回-1,时间复杂度O(1):int get(int idx);


输入描述:
输入为一系列的操作,一行一个操作,操作分为三类:
1. 从尾部追加新元素,格式为:push + 空格 + 整数
2. 删除尾部元素,格式为:pop
3. 根据下标获取元素,格式为:get + 空格 + 下标索引

输出描述:
每个操作对应一行输出:
1. 对于push操作,输出push之后数组的大小
2. 对于pop操作,输出pop()函数的返回值,即:删除的整数
3. 对于get操作,输出get()函数的返回值,即:该下标对应的整数

输入例子1:
push 1
push 3
pop
push 4
get 0
get 4

输出例子1:
1
2
3
2
1
-1

C语言版本

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
  
#define CMD_PUSH "push"
#define CMD_POP "pop"
#define CMD_GET "get"
typedef struct array_type{
    int *array_base;
    int size;
}array_t, *parray_t;
  
int *auto_array_creat(){
    parray_t pARRAY = NULL;
    pARRAY = (parray_t)malloc(sizeof(array_t));
    memset(pARRAY, 0, sizeof(array_t));
    return pARRAY;
}
  
void destory(parray_t pARRAY){
    free(pARRAY->array_base);
    free(pARRAY);
}
  
int push(int data, parray_t pARRAY){
    pARRAY->array_base = (int *)realloc(pARRAY->array_base, (pARRAY->size + 1)*sizeof(int));
    pARRAY->array_base[pARRAY->size] = data;
    pARRAY->size = pARRAY->size + 1;
    return pARRAY->size;
}
  
int pop(parray_t pARRAY){
    if(pARRAY->size <= 0) return -1;
    int ret = pARRAY->array_base[pARRAY->size - 1];
    pARRAY->array_base = (int *)realloc(pARRAY->array_base, (pARRAY->size - 1)*sizeof(int));
    pARRAY->size = pARRAY->size - 1;
    return ret;
}
  
int get(int index, parray_t pARRAY){
    return (index < 0 || index >= pARRAY->size)? -1:pARRAY->array_base[index];
}
  
int main(){
    parray_t pARRAY = NULL, pARRAY_TMP = NULL;
    char cmd[10];
    int data;
    if(NULL == (pARRAY = auto_array_creat())){
        printf("create auto_array failed.\n");
        return -1;
    }
    pARRAY_TMP = pARRAY;
      
    while(EOF != scanf("%s", cmd)){
        if(strcmp(cmd, CMD_PUSH) >= 0){
            scanf("%d", &data);
            printf("%d\n", push(data, pARRAY));
        }
        else if(strcmp(cmd, CMD_POP) >= 0){
            printf("%d\n", pop(pARRAY));
        }
        else if(strcmp(cmd, CMD_GET) >= 0){
            scanf("%d", &data);
            printf("%d\n", get(data, pARRAY));
        }
    }
  
    destory(pARRAY);
    pARRAY = NULL;
    pARRAY_TMP = NULL;
 
    return 0;
}

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务