题解 | 【模板】序列操作

【模板】序列操作

https://www.nowcoder.com/practice/12da4185c0bb45918cfdc3072e544069





//竞赛实现风格
#include <stdio.h>
#include <stdlib.h>

int main() {
    int q;
    scanf("%d", &q);

    int capacity = 1000;
    int size = 0;
    int* a = (int*)malloc(sizeof(int) * capacity);

    if(a == NULL)
    {
        return -1;
    }

    while (q--) {
        int op;
        scanf("%d", &op);

        if (op == 1) {            // push_back在末尾添加元素
            int x;
            scanf("%d", &x);
            if (size == capacity) {
                capacity *= 2;//容量翻倍
                a = (int*)realloc(a, sizeof(int) * capacity);

                if(a == NULL)
                {
                    return -1;
                }
            }
            a[size++] = x;

        } else if (op == 2) {     // pop_back删除末尾元素
            if (size > 0) size--;

        } else if (op == 3) {     // print indexed element打印下标元素
            int i;
            scanf("%d", &i);
            if (i >= 0 && i < size)
                printf("%d\n", a[i]);

        } else if (op == 4) {     // insert at index i+1在下标i后插入元素
            int i, x;
            scanf("%d %d", &i, &x);
            if (i >= 0 && i <= size - 1) {
                if (size == capacity) {
                    capacity *= 2;
                    a = (int*)realloc(a, sizeof(int) * capacity);
                }
                // shift
                for (int k = size; k > i + 1; k--) {
                    a[k] = a[k - 1];
                }
                a[i + 1] = x;
                size++;
            }

        } else if (op == 5) {     // sort increasing升序排序
            for (int i = 0; i < size; i++) {
                for (int j = i + 1; j < size; j++) {
                    if (a[j] < a[i]) {
                        int t = a[i];
                        a[i] = a[j];
                        a[j] = t;
                    }
                }
            }

        } else if (op == 6) {     // sort decreasing降序排序
            for (int i = 0; i < size; i++) {
                for (int j = i + 1; j < size; j++) {
                    if (a[j] > a[i]) {
                        int t = a[i];
                        a[i] = a[j];
                        a[j] = t;
                    }
                }
            }

        } else if (op == 7) {     // print size打印当前长度
            printf("%d\n", size);

        } else if (op == 8) {     // print all打印整个序列
            for (int i = 0; i < size; i++) {
                printf("%d", a[i]);
                if (i < size - 1) printf(" ");
            }
            printf("\n");
        }
    }

    free(a);
    return 0;
}












































//工程实践风格,OJ判题通过不了
// #include <stdio.h>
// #include <stdlib.h>
// #include <string.h>
// #include <ctype.h>

// // 动态数组结构体:存储序列数据、容量和当前长度
// typedef struct {
//     int *data;   // 存储序列元素
//     int size;    // 当前元素个数
//     int capacity;// 数组容量(避免频繁扩容)
// } Seq;

// // 初始化序列
// void initSeq(Seq *seq) {
//     seq->size = 0;
//     seq->capacity = 4;  // 初始容量设为4,可按需扩容
//     seq->data = (int*)malloc(seq->capacity * sizeof(int));
// }

// // 扩容函数(当容量不足时调用)
// void expand(Seq *seq) {
//     seq->capacity *= 2;  // 容量翻倍
//     seq->data = (int*)realloc(seq->data, seq->capacity * sizeof(int));
// }

// // 向末尾添加元素
// void pushBack(Seq *seq, int x) {
//     if (seq->size >= seq->capacity) {
//         expand(seq);  // 容量不足时扩容
//     }
//     seq->data[seq->size++] = x;
// }

// // 删除末尾元素(题目保证非空)
// void popBack(Seq *seq) {
//     if (seq->size > 0) {
//         seq->size--;
//     }
// }

// // 在指定下标插入元素
// void insert(Seq *seq, int i, int x) {
//     if (seq->size >= seq->capacity) {
//         expand(seq);  // 扩容
//     }
//     // 从末尾开始后移元素,空出位置i
//     for (int j = seq->size; j > i; j--) {
//         seq->data[j] = seq->data[j-1];
//     }
//     seq->data[i] = x;
//     seq->size++;
// }

// // 升序排序(冒泡排序,适合小规模数据)
// void sortAsc(Seq *seq) {
//     for (int i = 0; i < seq->size - 1; i++) {
//         for (int j = 0; j < seq->size - 1 - i; j++) {
//             if (seq->data[j] > seq->data[j+1]) {
//                 int temp = seq->data[j];
//                 seq->data[j] = seq->data[j+1];
//                 seq->data[j+1] = temp;
//             }
//         }
//     }
// }

// // 降序排序
// void sortDesc(Seq *seq) {
//     for (int i = 0; i < seq->size - 1; i++) {
//         for (int j = 0; j < seq->size - 1 - i; j++) {
//             if (seq->data[j] < seq->data[j+1]) {
//                 int temp = seq->data[j];
//                 seq->data[j] = seq->data[j+1];
//                 seq->data[j+1] = temp;
//             }
//         }
//     }
// }

// // 释放动态数组内存
// void freeSeq(Seq *seq) {
//     free(seq->data);
//     seq->data = NULL;
//     seq->size = 0;
//     seq->capacity = 0;
// }

// int main() {
//     int q;
//     scanf("%d", &q);
//     Seq seq;
//     initSeq(&seq);

//     while (q--) {
//         int op;
//         scanf("%d", &op);  // 读取操作类型

//         switch (op) {
//             case 1: {  // 添加元素到末尾
//                 int x;
//                 scanf("%d", &x);
//                 pushBack(&seq, x);
//                 break;
//             }
//             case 2: {  // 删除末尾元素
//                 popBack(&seq);
//                 break;
//             }
//             case 3: {  // 输出下标i的元素
//                 int i;
//                 scanf("%d", &i);
//                 printf("%d\n", seq.data[i]);
//                 break;
//             }
//             case 4: {  // 在i处插入x
//                 int i, x;
//                 scanf("%d %d", &i, &x);
//                 insert(&seq, i, x);
//                 break;
//             }
//             case 5: {  // 升序排序
//                 sortAsc(&seq);
//                 break;
//             }
//             case 6: {  // 降序排序
//                 sortDesc(&seq);
//                 break;
//             }
//             case 7: {  // 输出长度
//                 printf("%d\n", seq.size);
//                 break;
//             }
//             case 8: {  // 输出整个序列
//                 for (int i = 0; i < seq.size; i++) {
//                     if (i > 0) {
//                         printf(" ");  // 元素间加空格
//                     }
//                     printf("%d", seq.data[i]);
//                 }
//                 printf("\n");
//                 break;
//             }
//         }
//     }

//     freeSeq(&seq);  // 释放内存,避免泄漏
//     return 0;
// }

全部评论

相关推荐

评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务