题解 | 【模板】序列操作
【模板】序列操作
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;
// }

查看29道真题和解析