郑州轻工业大学2022-2023(2) 数据结构题目集 - ZZULI
6-1 线性表元素的区间删除
6-1 线性表元素的区间删除
分数 20
全屏浏览题目
切换布局
作者 DS课程组
单位 浙江大学
给定一个顺序存储的线性表,请设计一个函数删除所有值大于min而且小于max的元素。删除后表中剩余元素保持顺序存储,并且相对位置不能改变。
函数接口定义:
List Delete( List L, ElementType minD, ElementType maxD );
其中
List
结构定义如下:
typedef int Position; typedef struct LNode *List; struct LNode { ElementType Data[MAXSIZE]; Position Last; /* 保存线性表中最后一个元素在数组中的位置 */ };
L
是用户传入的一个线性表,其中ElementType
元素可以通过>、==、<进行比较;minD
和maxD
分别为待删除元素的值域的下、上界。函数Delete
应将Data[]
中所有值大于minD
而且小于maxD
的元素删除,同时保证表中剩余元素保持顺序存储,并且相对位置不变,最后返回删除后的表。裁判测试程序样例:
#include <stdio.h> #define MAXSIZE 20 typedef int ElementType; typedef int Position; typedef struct LNode *List; struct LNode { ElementType Data[MAXSIZE]; Position Last; /* 保存线性表中最后一个元素的位置 */ }; List ReadInput(); /* 裁判实现,细节不表。元素从下标0开始存储 */ void PrintList( List L ); /* 裁判实现,细节不表 */ List Delete( List L, ElementType minD, ElementType maxD ); int main() { List L; ElementType minD, maxD; int i; L = ReadInput(); scanf("%d %d", &minD, &maxD); L = Delete( L, minD, maxD ); PrintList( L ); return 0; } /* 你的代码将被嵌在这里 */
输入样例:
10 4 -8 2 12 1 5 9 3 3 10 0 4
输出样例:
4 -8 12 5 9 10
代码长度限制
16 KB
时间限制
200 ms
内存限制
64 MB
代码
List Delete( List L, ElementType minD, ElementType maxD ){int endNum = 0;int length = L->Last + 1;int* remain = (int*)malloc(sizeof(int) * length);int j = 0;for(int i = 0; i < length; i++){if(L->Data[i] <= minD || L->Data[i] >= maxD){ //保留需要删除的区间之外的值endNum++;remain[j++] = L->Data[i];}}List list = (List)malloc(sizeof(struct LNode));memset(list->Data, 0, sizeof(list->Data));for(int i = 0; i < endNum; i++){ //用保留的值重新创建一个链表list->Data[i] = remain[i];}list->Last = endNum - 1;return list; }
6-2 有序表的插入
6-2 有序表的插入【有题解视频】
分数 10
全屏浏览题目
切换布局
作者 CUIT通信DS课程组
单位 成都信息工程大学
设顺序表中的数据元素是按值非递减有序排列的,试编写一算法,将x插入到顺序表的适当位置上,以保持顺序表的有序性。
函数接口定义:
void ListInsertSort(SqList *L, DataType x);
其中
L
和x
都是用户传入的参数。L
表示顺序表,x
是要插入的元素。裁判测试程序样例:
#include"stdio.h" #define LISTSIZE 100 typedef int DataType; typedef struct{ DataType items[LISTSIZE]; int length; }SqList; /* 本题要求函数 */ void ListInsertSort(SqList *L, DataType x); int InitList(SqList *L) {/*L为指向顺序表的指针*/ L->length=0; return 1; } int ListLength(SqList L) {/*L为顺序表*/ return L.length; } int ListInsert(SqList *L,int pos,DataType item) {/*L为指向顺序表的指针,pos为插入位置,item为待插入的数据元素*/ int i; if(L->length>=LISTSIZE){ printf("顺序表已满,无法进行插入操作!");return 0;} if(pos<=0 || pos>L->length+1){ printf("插入位置不合法,其取值范围应该是[1,length+1]"); return 0; } for(i=L->length-1; i>=pos-1; i--) /*移动数据元素*/ L->items[i+1]=L->items[i]; L->items[pos-1]=item; /*插入*/ L->length++; /*表长增一*/ return 1; } int TraverseList(SqList L) {/*L为顺序表*/ int i; for(i=0;i<L.length;i++) printf("%d ",L.items[i]); printf("\n"); return 1; } void main() { int i,input,x; SqList L1; //定义顺序表 InitList(&L1); //初始化建空表 for(i=0;;i++) { scanf("%d",&input); if(input==-1)break; ListInsert(&L1, i+1, input); //插入数据 } scanf("%d",&x); ListInsertSort(&L1, x); // 本题要求函数在主函数中的调用 TraverseList(L1); //遍历 } /* 请在这里填写答案 */
输入样例:
在这里给出一组输入。例如:
1 3 6 7 8 9 -1 3
输出样例:
在这里给出相应的输出。例如:
1 3 3 6 7 8 9
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
代码
void ListInsertSort(SqList *L, DataType x) {int insertPoint = -1;while (L->items[++insertPoint] <= x && insertPoint < L->length);//寻找插入位置ListInsert(L, insertPoint + 1, x);//调用题目给的函数进行插入 }
6-3 合并两个有序数组
6-3 合并两个有序数组
分数 20
全屏浏览题目
切换布局
作者 李廷元
单位 中国民用航空飞行学院
要求实现一个函数merge,将长度为m的升序数组a和长度为n的升序数组b合并到一个新的数组c,合并后的数组仍然按升序排列。
函数接口定义:
void printArray(int* arr, int arr_size); /* 打印数组,细节不表 */ void merge(int* a, int m, int* b, int n, int* c); /* 合并a和b为c */
其中a和b是按升序排列的数组,m和n分别为数组a、b的长度;c为合并后的升序数组。
裁判测试程序样例:
#include <stdio.h> #include <stdlib.h> void printArray(int* arr, int arr_size); /* 打印数组,细节不表 */ void merge(int* a, int m, int* b, int n, int* c); /* 合并a和b为c */ int main(int argc, char const *argv[]) { int m, n, i; int *a, *b, *c; scanf("%d", &m); a = (int*)malloc(m * sizeof(int)); for (i = 0; i < m; i++) { scanf("%d", &a[i]); } scanf("%d", &n); b = (int*)malloc(n * sizeof(int)); for (i = 0; i < n; i++) { scanf("%d", &b[i]); } c = (int*)malloc((m + n) * sizeof(int)); merge(a, m, b, n, c); printArray(c, m + n); return 0; } /* 请在这里填写答案 */
输入样例:
输入包含两行。
第一行为有序数组a,其中第一个数为数组a的长度m,紧接着m个整数。
第二行为有序数组b,其中第一个数为数组b的长度n,紧接着n个整数。7 1 2 14 25 33 73 84 11 5 6 17 27 68 68 74 79 80 85 87
输出样例:
输出为合并后按升序排列的数组。
1 2 5 6 14 17 25 27 33 68 68 73 74 79 80 84 85 87
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
代码
void merge(int* a, int m, int* b, int n, int* c){int j = 0, k = 0;for(int i = 0; i < m; k++){if(j < n)//以有序放完a为前提,尽量放符合条件的ba[i] < b[j] ? (c[k] = a[i++]) : (c[k] = b[j++]);elsec[k] = a[i++];}for(; j < n; j++){//如果b有剩余c[k++] = b[j];} }
6-4 顺序表操作集
6-4 顺序表操作集
分数 20
全屏浏览题目
切换布局
作者 陈越
单位 浙江大学
本题要求实现顺序表的操作集。
函数接口定义:
List MakeEmpty(); Position Find( List L, ElementType X ); bool Insert( List L, ElementType X, Position P ); bool Delete( List L, Position P );
其中
List
结构定义如下:
typedef int Position; typedef struct LNode *List; struct LNode { ElementType Data[MAXSIZE]; Position Last; /* 保存线性表中最后一个元素的位置 */ };
各个操作函数的定义为:
List MakeEmpty()
:创建并返回一个空的线性表;
Position Find( List L, ElementType X )
:返回线性表中X的位置。若找不到则返回ERROR;
bool Insert( List L, ElementType X, Position P )
:将X插入在位置P并返回true。若空间已满,则打印“FULL”并返回false;如果参数P指向非法位置,则打印“ILLEGAL POSITION”并返回false;
bool Delete( List L, Position P )
:将位置P的元素删除并返回true。若参数P指向非法位置,则打印“POSITION P EMPTY”(其中P是参数值)并返回false。裁判测试程序样例:
#include <stdio.h> #include <stdlib.h> #define MAXSIZE 5 #define ERROR -1 typedef enum {false, true} bool; typedef int ElementType; typedef int Position; typedef struct LNode *List; struct LNode { ElementType Data[MAXSIZE]; Position Last; /* 保存线性表中最后一个元素的位置 */ }; List MakeEmpty(); Position Find( List L, ElementType X ); bool Insert( List L, ElementType X, Position P ); bool Delete( List L, Position P ); int main() { List L; ElementType X; Position P; int N; L = MakeEmpty(); scanf("%d", &N); while ( N-- ) { scanf("%d", &X); if ( Insert(L, X, 0)==false ) printf(" Insertion Error: %d is not in.\n", X); } scanf("%d", &N); while ( N-- ) { scanf("%d", &X); P = Find(L, X); if ( P == ERROR ) printf("Finding Error: %d is not in.\n", X); else printf("%d is at position %d.\n", X, P); } scanf("%d", &N); while ( N-- ) { scanf("%d", &P); if ( Delete(L, P)==false ) printf(" Deletion Error.\n"); if ( Insert(L, 0, P)==false ) printf(" Insertion Error: 0 is not in.\n"); } return 0; } /* 你的代码将被嵌在这里 */
输入样例:
6 1 2 3 4 5 6 3 6 5 1 2 -1 6
输出样例:
FULL Insertion Error: 6 is not in. Finding Error: 6 is not in. 5 is at position 0. 1 is at position 4. POSITION -1 EMPTY Deletion Error. FULL Insertion Error: 0 is not in. POSITION 6 EMPTY Deletion Error. FULL Insertion Error: 0 is not in.
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
代码
List MakeEmpty(){//创建空表List list = (List) malloc(sizeof(struct LNode));memset(list->Data, 0, sizeof(list->Data));//初始化数据域list->Last = -1;//初始化尾指针return list; } Position Find( List L, ElementType X ){int pos = -1;while(++pos <= L->Last){//遍历表if(L->Data[pos] == X)//找到数据return pos;}return ERROR; } bool Insert( List L, ElementType X, Position P ){if(L->Last >= MAXSIZE - 1){//表已满printf("FULL");return false;}if(P < 0 || P > L->Last + 1){//越界printf("ILLEGAL POSITION");return false;}for(int i = L->Last; i >= P; i--){//移动元素L->Data[i + 1] = L->Data[i];}L->Data[P] = X;//插入L->Last++;//更新属性return true; } bool Delete( List L, Position P ){if(P < 0 || P > L->Last){//越界printf("POSITION %d EMPTY", P);return false;}for(int i = P; i < L->Last; i++){//移动元素L->Data[i] = L->Data[i + 1];}L->Last--;//更新属性return true; }
6-5 递增的整数序列链表的插入
6-5 递增的整数序列链表的插入
分数 15
全屏浏览题目
切换布局
作者 DS课程组
单位 浙江大学
本题要求实现一个函数,在递增的整数序列链表(带头结点)中插入一个新整数,并保持该序列的有序性。
函数接口定义:
List Insert( List L, ElementType X );
其中
List
结构定义如下:
typedef struct Node *PtrToNode; struct Node { ElementType Data; /* 存储结点数据 */ PtrToNode Next; /* 指向下一个结点的指针 */ }; typedef PtrToNode List; /* 定义单链表类型 */
L
是给定的带头结点的单链表,其结点存储的数据是递增有序的;函数Insert
要将X
插入L
,并保持该序列的有序性,返回插入后的链表头指针。裁判测试程序样例:
#include <stdio.h> #include <stdlib.h> typedef int ElementType; typedef struct Node *PtrToNode; struct Node { ElementType Data; PtrToNode Next; }; typedef PtrToNode List; List Read(); /* 细节在此不表 */ void Print( List L ); /* 细节在此不表 */ List Insert( List L, ElementType X ); int main() { List L; ElementType X; L = Read(); scanf("%d", &X); L = Insert(L, X); Print(L); return 0; } /* 你的代码将被嵌在这里 */
输入样例:
5 1 2 4 5 6 3
输出样例:
1 2 3 4 5 6
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
代码
List Insert( List L, ElementType X ){PtrToNode p = L;while(p->Next && (p->Next->Data < X)){ //寻找插入位置p = p->Next;}PtrToNode x = (PtrToNode)malloc(sizeof(struct Node));//插入x->Data = X;x->Next = p->Next;p->Next = x;return L; }
6-6 删除单链表偶数节点
6-6 删除单链表偶数节点
分数 20
全屏浏览题目
切换布局
作者 C课程组
单位 浙江大学
本题要求实现两个函数,分别将读入的数据存储为单链表、将链表中偶数值的结点删除。链表结点定义如下:
struct ListNode {int data;struct ListNode *next; };
函数接口定义:
struct ListNode *createlist(); struct ListNode *deleteeven( struct ListNode *head );
函数
createlist
从标准输入读入一系列正整数,按照读入顺序建立单链表。当读到−1时表示输入结束,函数应返回指向单链表头结点的指针。函数
deleteeven
将单链表head
中偶数值的结点删除,返回结果链表的头指针。裁判测试程序样例:
#include <stdio.h> #include <stdlib.h> struct ListNode { int data; struct ListNode *next; }; struct ListNode *createlist(); struct ListNode *deleteeven( struct ListNode *head ); void printlist( struct ListNode *head ) { struct ListNode *p = head; while (p) { printf("%d ", p->data); p = p->next; } printf("\n"); } int main() { struct ListNode *head; head = createlist(); head = deleteeven(head); printlist(head); return 0; } /* 你的代码将被嵌在这里 */
输入样例:
1 2 2 3 4 5 6 7 -1
输出样例:
1 3 5 7
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
代码
struct ListNode *createlist(){int n;struct ListNode * head = NULL;scanf("%d", &n);if(n != -1){//题目要求//先独立创建一个节点,在使用while创建其他节点,防止多分配内存head = (struct ListNode*) malloc(sizeof(struct ListNode));//创建头指针struct ListNode * body = head;body->data = n;body->next = NULL;while(scanf("%d", &n), n != -1){//继续读入//继续创建body->next = (struct ListNode*) malloc(sizeof(struct ListNode));body = body->next;body->data = n;body->next = NULL;}}return head; } struct ListNode *deleteeven( struct ListNode *head ){while(head && !(head->data % 2)){//先删除从开头便存在并且连续出现的偶数节点struct ListNode * p = head;head = head->next;free(p);}//第一个while过后,链表开头便不是偶数节点,方便继续删除struct ListNode * body = head;while(body && body->next){//再删除剩余的偶数节点if(!(body->next->data % 2)){struct ListNode * p = body->next;body->next = body->next->next;free(p);}else{body = body->next;}}return head; }
6-7 逆序数据建立链表
6-7 逆序数据建立链表
分数 20
全屏浏览题目
切换布局
作者 C课程组
单位 浙江大学
本题要求实现一个函数,按输入数据的逆序建立一个链表。
函数接口定义:
struct ListNode *createlist();
函数
createlist
利用scanf
从输入中获取一系列正整数,当读到−1时表示输入结束。按输入数据的逆序建立一个链表,并返回链表头指针。链表节点结构定义如下:
struct ListNode { int data; struct ListNode *next; };
裁判测试程序样例:
#include <stdio.h> #include <stdlib.h> struct ListNode { int data; struct ListNode *next; }; struct ListNode *createlist(); int main() { struct ListNode *p, *head = NULL; head = createlist(); for ( p = head; p != NULL; p = p->next ) printf("%d ", p->data); printf("\n"); return 0; } /* 你的代码将被嵌在这里 */
输入样例:
1 2 3 4 5 6 7 -1
输出样例:
7 6 5 4 3 2 1
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
代码
//头插,其他的和上一题的创建道理一样 struct ListNode *createlist(){int n;struct ListNode * head = NULL;scanf("%d", &n);if(n != -1){head = (struct ListNode*) malloc(sizeof(struct ListNode));head->data = n;head->next = NULL;while(scanf("%d", &n), n != -1){struct ListNode* p = (struct ListNode*) malloc(sizeof(struct ListNode));;p->data = n;p->next = head;//头插head = p;//更新头}}return head; }
6-8 求链表的倒数第m个元素
6-8 求链表的倒数第m个元素
分数 20
全屏浏览题目
切换布局
作者 DS课程组
单位 浙江大学
请设计时间和空间上都尽可能高效的算法,在不改变链表的前提下,求链式存储的线性表的倒数第m(>0)个元素。
函数接口定义:
ElementType Find( List L, int m );
其中
List
结构定义如下:
typedef struct Node *PtrToNode; struct Node { ElementType Data; /* 存储结点数据 */ PtrToNode Next; /* 指向下一个结点的指针 */ }; typedef PtrToNode List; /* 定义单链表类型 */
L
是给定的带头结点的单链表;函数Find
要将L
的倒数第m
个元素返回,并不改变原链表。如果这样的元素不存在,则返回一个错误标志ERROR
。裁判测试程序样例:
#include <stdio.h> #include <stdlib.h> #define ERROR -1 typedef int ElementType; typedef struct Node *PtrToNode; struct Node { ElementType Data; PtrToNode Next; }; typedef PtrToNode List; List Read(); /* 细节在此不表 */ void Print( List L ); /* 细节在此不表 */ ElementType Find( List L, int m ); int main() { List L; int m; L = Read(); scanf("%d", &m); printf("%d\n", Find(L,m)); Print(L); return 0; } /* 你的代码将被嵌在这里 */
输入样例:
5 1 2 4 5 6 3
输出样例:
4 1 2 4 5 6
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
代码
/* * 思路: * 使用两个指针依次开始遍历链表,让两个指针产生长为m的区间差 * 当第一个指针遍历到链表尾时,第二个指针恰好在倒数m处。: * 若有链表:1->2->3->4->5->6,m = 3,则: * p2↓ p1↓ * 1 -> 2 -> 3 -> 4 -> 5 -> 6 * |----3----| * */ ElementType Find( List L, int m ){PtrToNode p = L;int i = 0;while((L = L->Next)){if(++i >= m){//产生区间p = p->Next;}}if(i < m){//没有倒数第mreturn ERROR;}return p->Data; }
6-9 两个有序链表序列的合并
6-9 两个有序链表序列的合并
分数 15
全屏浏览题目
切换布局
作者 DS课程组
单位 浙江大学
本题要求实现一个函数,将两个链表表示的递增整数序列合并为一个非递减的整数序列。
函数接口定义:
List Merge( List L1, List L2 );
其中
List
结构定义如下:
typedef struct Node *PtrToNode; struct Node { ElementType Data; /* 存储结点数据 */ PtrToNode Next; /* 指向下一个结点的指针 */ }; typedef PtrToNode List; /* 定义单链表类型 */
L1
和L2
是给定的带头结点的单链表,其结点存储的数据是递增有序的;函数Merge
要将L1
和L2
合并为一个非递减的整数序列。应直接使用原序列中的结点,返回归并后的带头结点的链表头指针。裁判测试程序样例:
#include <stdio.h> #include <stdlib.h> typedef int ElementType; typedef struct Node *PtrToNode; struct Node { ElementType Data; PtrToNode Next; }; typedef PtrToNode List; List Read(); /* 细节在此不表 */ void Print( List L ); /* 细节在此不表;空链表将输出NULL */ List Merge( List L1, List L2 ); int main() { List L1, L2, L; L1 = Read(); L2 = Read(); L = Merge(L1, L2); Print(L); Print(L1); Print(L2); return 0; } /* 你的代码将被嵌在这里 */
输入样例:
3 1 3 5 5 2 4 6 8 10
输出样例:
1 2 3 4 5 6 8 10 NULL NULL
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
代码
List Merge( List L1, List L2 ){List ans = (List) malloc((sizeof(struct Node)));List body1 = L1->Next, body2 = L2->Next;List head = ans;//任意一个链表的数据判断完就停while(body1 && body2){if(body1->Data < body2->Data){ans->Next = body1;body1 = body1->Next;}else{ans->Next = body2;body2 = body2->Next;}ans = ans->Next;}//剩下没判断的数据必然相对于新链表尾有序,直接接上即可body1 ? (ans->Next = body1) : (ans->Next = body2);//题目要求,合并后原链表头将失去访问权限L1->Next = NULL;L2->Next = NULL;return head; }
7-1 一元多项式的乘法与加法运算
7-1 一元多项式的乘法与加法运算
分数 20
全屏浏览题目
切换布局
作者 DS课程组
单位 浙江大学
设计函数分别求两个一元多项式的乘积与和。
输入格式:
输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。
输出格式:
输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。零多项式应输出
0 0
。输入样例:
4 3 4 -5 2 6 1 -2 0 3 5 20 -7 4 3 1
输出样例:
15 24 -25 22 30 21 -10 20 -21 8 35 6 -33 5 14 4 -15 3 18 2 -6 1 5 20 -4 4 -5 2 9 1 -2 0
代码长度限制
16 KB
时间限制
200 ms
内存限制
64 MB
代码
#include <stdio.h> #include <malloc.h>//运算单元,bottom底数,top指数 typedef struct unit{int bottom;int top; }unit;//多项式,fml为运算单元数组,length为运算单元个数 typedef struct formula{unit* fml;int length; }formula;//运算单元相加函数 unit add(const unit a, const unit b){unit c = {a.bottom + b.bottom, a.top };if(!c.bottom)c.top = 0;return c; }//运算单元相乘函数 unit mul(const unit a, const unit b){unit c = {a.bottom * b.bottom, a.top + b.top};if(!c.bottom)c.top = 0;return c; }//排序规则,给qsort函数(stdlib.h中)用的 int sortRule(const void* a, const void * b){unit* c = (unit*)a;unit* d = (unit*)b;return d->top - c->top; }//多项式合并相同指数的运算单元的函数 formula* mergeCommon(const formula* f){if(f->length == 1){//多项式只有一个运算单元,不用合并直接返回return (formula*)f;}formula* f1 = (formula*) malloc(sizeof(formula));f1->fml = (unit*) malloc(sizeof(unit) * f->length);f1->length = 1;f1->fml[0] = f->fml[0];int k = 0;//过第一遍筛for(int i = 0, j = 1; j < f->length;){if(f->fml[j].bottom != 0){if(f->fml[i].top == f->fml[j].top){//指数相同,合并f1->fml[k] = add(f->fml[i], f->fml[j]);}else{//跳到未合并的位置,等待接收下一组运算单元的合并i = j;f1->fml[++k] = f->fml[i];//未遇到该指数的运算单元,添加入结果多项式f1->length++;}}j++;}k = 0;formula* f2 = (formula*) malloc(sizeof(formula));f2->fml = (unit*) malloc(sizeof(unit) * f1->length);f2->length = 0;//把得到的结果多项式再过一遍筛,筛除合并中出现的0for(int i = 0; i < f1->length; i++){if(!f1->fml[i].bottom)//如果底数为0continue;f2->fml[k++] = f1->fml[i];f2->length++;}free(f1);//若全为0,则至少保留一个if(!f2->length){f2->fml[0].top = 0;f2->fml[0].bottom = 0;f2->length = 1;}return f2; }//多项式相乘函数 formula* mulFormula(const formula* a, const formula* b){formula* f = (formula*) malloc(sizeof(formula));f->fml = (unit*) malloc(sizeof(unit) * a->length * b->length);f->length = a->length * b->length;int k = 0;//暴力运算,不管系数合并,先算出来再说。(其实效率很好,下面的加也一样,qsort似乎是双轴,极快)for(int i = 0; i < a->length; i++){for(int j = 0; j < b->length; j++){f->fml[k++] = mul(a->fml[i], b->fml[j]);}}//如果乘完只有一项,不用合并直接返回if(a->length == b->length && b->length == 1){return f;}//按指数从大到小排序,题目要求也方便合并qsort(f->fml, a->length * b->length, sizeof(unit), sortRule);//合并相同指数的运算单元并返回合并后的多项式return mergeCommon(f); }//多项式相加函数 formula* addFormula(const formula* a, const formula* b){formula* f = (formula*) malloc(sizeof(formula));f->fml = (unit*) malloc(sizeof(unit) * (a->length + b->length));f->length = a->length + b->length;//同样暴力,把俩多项式直接连成一个,不管合并for(int i = 0; i < f->length; i++){if(i < a->length)f->fml[i] = a->fml[i];elsef->fml[i] = b->fml[i - a->length];}//同理qsort(f->fml, a->length + b->length, sizeof(unit), sortRule);return mergeCommon(f); }//输出函数 void printFormula(formula* f){for(int i = 0; i < f->length; i++){printf("%d %d", f->fml[i].bottom, f->fml[i].top);if(i < f->length - 1)printf(" ");}printf("\n"); }int main(){int n;scanf("%d", &n);//创建多项式1formula* f1 = (formula*) malloc(sizeof(formula));f1->fml = (unit*)malloc(sizeof(unit) * n);for(int i = 0; i < n; i++){scanf("%d %d", &f1->fml[i].bottom, &f1->fml[i].top);}f1->length = n;scanf("%d", &n);//创建多项式2formula* f2 = (formula*) malloc(sizeof(formula));f2->fml = (unit*)malloc(sizeof(unit) * n);for(int i = 0; i < n; i++){scanf("%d %d", &f2->fml[i].bottom, &f2->fml[i].top);}f2->length = n;//运算printFormula(mulFormula(f1,f2));printFormula(addFormula(f1,f2)); }
7-2 符号配对
7-2 符号配对
分数 20
全屏浏览题目
切换布局
作者 DS课程组
单位 浙江大学
请编写程序检查C语言源程序中下列符号是否配对:
/*
与*/
、(
与)
、[
与]
、{
与}
。输入格式:
输入为一个C语言源程序。当读到某一行中只有一个句点
.
和一个回车的时候,标志着输入结束。程序中需要检查配对的符号不超过100个。输出格式:
首先,如果所有符号配对正确,则在第一行中输出
YES
,否则输出NO
。然后在第二行中指出第一个不配对的符号:如果缺少左符号,则输出?-右符号
;如果缺少右符号,则输出左符号-?
。输入样例1:
void test() {int i, A[10];for (i=0; i<10; i++) { /*/A[i] = i; } .
输出样例1:
NO /*-?
输入样例2:
void test() {int i, A[10];for (i=0; i<10; i++) /**/A[i] = i; }] .
输出样例2:
NO ?-]
输入样例3:
void test() {int idouble A[10];for (i=0; i<10; i++) /**/A[i] = 0.1*i; } .
输出样例3:
YES
鸣谢用户 王渊博 补充数据!
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
代码
/* * 思路:使用栈对括号进行消消乐,最后没消完或中途出现不可消即为配对失败 */#include <malloc.h> #include <string.h> #include <stdio.h>//使用枚举创建布尔型变量,方便写代码(也可以不创建,直接0,1,一样) typedef enum bool{true = 1, false = 0}bool;//栈 typedef struct stack{char* dataBase;char top;int size;int capacity; }stack;//创建栈函数 stack getStack(int capacity){stack s;s.dataBase = (char*) malloc(sizeof(char) * capacity);memset(s.dataBase, 0, sizeof(char));s.capacity = capacity;s.size = 0;s.top = '\0';return s; }//向栈中添加数据 void push(stack* s, char data){if(s->size >= s->capacity){//如果容量不够,扩容s->capacity *= 2;s->dataBase = realloc(s->dataBase, s->capacity);}s->dataBase[s->size] = data;s->top = data;s->size++; }//弹出栈顶数据 char pop(stack* s){if(!s->size){return '\0';}char ans = s->dataBase[s->top];s->size--;s->dataBase[s->size] = '\0';if(s->size)s->top = s->dataBase[s->size - 1];elses->top = '\0';return ans; }//判断栈是否为空 bool isEmpty(stack* s){return s->size == 0 ? true : false; }int main(){stack s = getStack(100);char c, defAns; // defAns 第一个未配对的符号//isEnd 用于判断是否结束; right 用于判断是否有未配对的括号//isL 判断是否是/**/的左侧符号‘/*’; isR 判断是否是/**/的右侧符号‘*/’bool isEnd = false, right = true, isL = false, isR = false;while((c = (char)getchar())){//判断是否结束if(isEnd){if(c == '\n')break;elseisEnd = false;}if(c == '.')isEnd = true;//是否有不配对的括号,如果有则不进行下方的判断,读完输入就进行下一步if(right){//如果上一个符号是‘/’并且这个符号是*。下面的判断类同if(c == '*' && isL){push(&s, '<');//把‘/*’看做<压入栈,方便消消乐,也可以用其他符号,看自己喜欢isL = false;}else if(c == '*')isR = true;else if(c == '/' && isR){if(isEmpty(&s) || s.top != '<'){//如果栈是空的或者栈顶的符号无法与之配对right = false;//符号配对失败defAns = s.top;//记录未能配对的符号}else if(s.top == '<'){pop(&s);isR = false;}}//下方的比较类同else if(c == '/')isL = true;else if(c == '{' || c == '[' || c == '(')push(&s, c);else if(c == '}' || c == ']' || c == ')'){if(isEmpty(&s)){right = false;defAns = c;}else{bool flag = false;switch(c){case '}':if(s.top == '{'){pop(&s);}else flag = true; break;case ']':if(s.top == '['){pop(&s);}else flag = true; break;case ')':if(s.top == '('){pop(&s);}else flag = true; break;default:break;}if(flag){right = false;if(isEmpty(&s))defAns = c;elsedefAns = s.top;}}}}}if(isEmpty(&s) && right){printf("YES");}else{//按要求输出即可printf("NO\n");if(defAns == '}' || defAns == ']' || defAns == ')'){printf("?-%c", defAns);}else if(defAns == '{' || defAns == '[' || defAns == '('){printf("%c-?", defAns);}else{if(defAns == '<')printf("/*-?");elseprintf("?-*/");}} }
7-3 银行业务队列简单模拟
7-3 银行业务队列简单模拟
分数 25
全屏浏览题目
切换布局
作者 DS课程组
单位 浙江大学
设某银行有A、B两个业务窗口,且处理业务的速度不一样,其中A窗口处理速度是B窗口的2倍 —— 即当A窗口每处理完2个顾客时,B窗口处理完1个顾客。给定到达银行的顾客序列,请按业务完成的顺序输出顾客序列。假定不考虑顾客先后到达的时间间隔,并且当不同窗口同时处理完2个顾客时,A窗口顾客优先输出。
输入格式:
输入为一行正整数,其中第1个数字N(≤1000)为顾客总数,后面跟着N位顾客的编号。编号为奇数的顾客需要到A窗口办理业务,为偶数的顾客则去B窗口。数字间以空格分隔。
输出格式:
按业务处理完成的顺序输出顾客的编号。数字间以空格分隔,但最后一个编号后不能有多余的空格。
输入样例:
8 2 1 3 9 4 11 13 15
输出样例:
1 3 2 9 11 4 13 15
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
代码
//题目意思很明显,让练队列#include <stdio.h> #include <malloc.h>//大多数构造思路与前几题一样,不过多赘述 typedef enum bool{true = 1, false = 0}bool;typedef struct qDataBase{//数据域int coNum;struct qDataBase* next; }qDataBase, head, tail;typedef struct queue{//队列double speed;//队列效率,,这个好像没用上int size;head* hd;tail* tl; }queue;//数据入队 void enq(queue* q, int coNum){qDataBase* dataBase = (qDataBase*)malloc(sizeof(qDataBase));dataBase->coNum = coNum;q->tl->next = dataBase;q->tl = q->tl->next;q->tl->next = NULL;q->size++; }//数据出队 int deq(queue* q){if(q->size == 1){//如果队中只剩1个元素,调整尾指针防止尾指针丢失q->tl = q->hd;}qDataBase* t = q->hd->next;int coNum = q->hd->next->coNum;q->hd->next = q->hd->next->next;free(t);q->size--;return coNum; }//获得队首元素 int top(queue* q){return q->hd->next->coNum; }//判断队是否为空 int isEmpty(queue* q){return q->size == 0; }//创建队列,type是A队或B队(其实后来想想没啥用) queue* getQueue(int type){queue* tar = (queue*)malloc(sizeof(queue));qDataBase* dataBase = (qDataBase*)malloc(sizeof(qDataBase));tar->hd = dataBase;tar->tl = dataBase;tar->size = 0;if(!type)tar->speed = 2;elsetar->speed = 1;return tar; }int main(){int number, coNum;queue* qA = getQueue(0);queue* qB = getQueue(1);scanf("%d", &coNum);//给两个队列添加元素while(coNum--){scanf("%d", &number);if(number % 2)enq(qA, number);elseenq(qB, number);}//timer % 1 == 0 A出(不用算),% 2 == 0 B出int timer = 1;bool isFirst = true;//以A队列为基准,A队出俩B队出1个while(!isEmpty(qA)){if(isFirst)//为了不多输出空格printf("%d", deq(qA));elseprintf(" %d", deq(qA));if(!timer && !isEmpty(qB))//符合时间且B队不空的话printf(" %d", deq(qB));timer++;timer %= 2;isFirst = false;}//若B队在A队出完后还有剩余,则按队中顺序输出while(!isEmpty(qB)){if(isFirst)printf("%d", deq(qB));elseprintf(" %d", deq(qB));isFirst = false;} }
相关文章:
郑州轻工业大学2022-2023(2) 数据结构题目集 - ZZULI
6-1 线性表元素的区间删除 6-1 线性表元素的区间删除 分数 20 全屏浏览题目 切换布局 作者 DS课程组 单位 浙江大学 给定一个顺序存储的线性表,请设计一个函数删除所有值大于min而且小于max的元素。删除后表中剩余元素保持顺序存储,并且相对位置不能改变…...
【Python语言基础】——Python MySQL Drop Table
Python语言基础——Python MySQL Drop Table 文章目录Python语言基础——Python MySQL Drop Table一、Python MySQL Drop Table一、Python MySQL Drop Table 删除表 您可以使用 “DROP TABLE” 语句来删除已有的表: 实例 删除 “customers” 表: import…...
2023美团面试真题
面试前需要准备: 1. Java 八股文:了解常考的题型和回答思路; 2. 算法:刷 100-200 道题,记住刷题最重要的是要理解其思想,不要死记硬背,碰上原题很难,但 大多数的解题思路是相通的…...
【微信小程序开发全流程】篇章0:基于JavaScript开发的校园综合类微信小程序的概览
基于JavaScript开发的校园综合类微信小程序的概览 本文仅供学习,未经同意请勿转载 一些说明:上述项目来源于笔者我本科大三阶段2019年电子设计课程项目,在这个项目中,我主要是负责的部分有前端,前后端的对接…...
如何分析sql性能
1、前言 提到sql性能分析,可能都会想到explain,它在mysql里被称为执行计划,也就是说可以通过该命令看出mysql在通过优化器分析之后如何执行sql。mysql的内置优化器十分强大,它能帮我们把sql再次优化,以最低的成本去执…...
市场营销书籍推荐:《经理人参阅:市场营销》
要学好市场营销有什么好方法?答案是看书!比起碎片化地去阅读一些文章或看一些相关视频,读书来得更实在些。倘若能静下心来好好读上一本系统性的市场营销书籍,学好营销管理将不会再是一件难事。然而,问题的关键是&#…...
WPF 控件专题 MediaElement控件详解
1、MediaElement 介绍 MediaElement:表示包含音频和/或视频的控件。 MediaOpened在引发事件之前,ActualWidth控件将ActualHeight报告为零,因为媒体内容用于确定控件的最终大小和位置。 对于仅音频内容,这些属性始终为零。 对于固…...
基于SpringBoot+SpringCloud+Vue前后端分离项目实战 --开篇
本文目录前言做项目的三大好处强强联手(天狗组合)专栏作者简介专栏的优势后端规划1. SpringBoot 和 SpringCloud 的选择2. Mybatis 和 MybatisPlus 和 JPA 的选择3. MySQL 和 Mongodb 的选择4. Redis 和 RocketMQ5. 后端规划小总结后端大纲提前掌握的知识点一期SpringBoot二期S…...
循环队列的实现
我们知道队列的实现可以用单链表和数组,但是循环链表也可以使用这两种方式。首先我们来看看单链表:首先使用单链表,我们需要考虑循环队列的一些特点。单链表实现循环队列我们要考虑几个核心问题:首先我们要区别 解决 空 和 满 的问…...
MTK平台开发入门到精通(休眠唤醒篇)休眠唤醒LPM框架
文章目录 一、lpm驱动源码分析二、设备属性调试文件沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇文章将介绍 lpm 驱动源码分析。 mtk 平台下,其默认的 lpm 机制的源码位置:drivers/misc/mediatek/lpm/ 一、lpm驱动源码分析 目录:drivers/misc/mediatek/lpm/…...
ThreadLocal详解
一、ThreadLocal简介 1、简介 ThreadLocal叫做线程变量,它是一个线程的本地变量,意味着这个变量是线程独有的,是不能与其他线程共享的。这样就可以避免资源竞争带来的多线程的问题。 即 ThreadLocal类用来提供线程内部的局部变量࿰…...
利用Cookie劫持+HTML注入进行钓鱼攻击
目录 HTML注入和cookie劫持: 发现漏洞 实际利用 来源 HTML注入和cookie劫持: HTML注入漏洞一般是由于在用户能够控制的输入点上,由于缺乏安全过滤,导致攻击者能将任意HTML代码注入网页。此类漏洞可能会引起许多后续攻击&#…...
【接口汇总】常用免费的API
短信API 短信验证码:可用于登录、注册、找回密码、支付认证等等应用场景。支持三大运营商,3秒可达,99.99%到达率,支持大容量高并发。 通知短信:当您需要快速通知用户时,通知短信是最快捷有效的…...
数字信号处理知识点
数字信号处理知识点1 频谱图中,横坐标取值范围的含义2 MATLAB常用函数2.1 波形产生2.2 滤波器分析2.3 滤波器实现2.4 线性系统变换2.5 滤波器设计2.5.1 FIR滤波器2.5.2 IIR滤波器2.6 Transforms(变换)2.7 统计信号处理和谱分析2.8 Windows(窗函数)2.9 Parametric Mo…...
计算机网络第八版——第三章课后题答案(超详细)
第三章 该答案为博主在网络上整理,排版不易,希望大家多多点赞支持。后续将会持续更新(可以给博主点个关注~ 第一章 答案 第二章 答案 【3-01】数据链路(即逻辑链路)与链路(即物理链路)有何区…...
九龙证券|磷酸亚铁锂是什么?磷酸亚铁锂的特点和性能介绍
磷酸亚铁锂是一种新式锂离子电池电极资料,化学式:LiFePO4,磷酸亚铁锂为近来新开发的锂离子电池电极资料,首要用于动力锂离子电池,作为正极活性物质运用,人们习气也称其为磷酸铁锂。 磷酸亚铁锂的特色和功能…...
3D目标检测(二)—— 直接处理点云的3D目标检测网络VoteNet、H3DNet
前言上次介绍了基于Point-Based方法处理点云的模块,3D目标检测(一)—— 基于Point-Based方法的PointNet点云处理系列,其中相关的模块则是构成本次要介绍的,直接在点云的基础上进行3D目标检测网络的基础。VoteNet对于直接在点云上预…...
Java学习-IO流-常用工具包(hutool)
Java学习-IO流-常用工具包(hutool) hutool工具包 DateUtil:日期时间工具类 TImeInterval:计时器工具类 StrUtil:字符串工具类 HexUtil:16进制工具类 HashUtil:Hash算法类 ObjectUtil࿱…...
【LeetCode】1. 两数之和
题目链接:https://leetcode.cn/problems/two-sum/ 📕题目要求: 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入…...
【数值模型环境搭建】Intel编译器安装
Intel编译器在数值模型编译中被广泛使用,它有一个很好的地方是自带Mpich,不需要额外安装。本文介绍Intel2018.1.163版本的安装。 1、安装包获取 Intel编译器可从官网下载下载: https://www.intel.cn/content/www/cn/zh/homepage.html 或者…...
操作VMware vCenter Converter 实现物理机迁移到虚拟机
实验目的:熟练VMware虚拟化项目中,物理机向ESXI5迁移操作过程。 1、打开VMwarevCenterConverterStandalone5.0软件,按“转换计算机”。 2、选择“已打开电源的计算机”。并输入远程要连接迁移物理机IP地址,登录帐户和密码。 然后…...
hutool XML反序列化漏洞(CVE-2023-24162)
漏洞简介 Hutool 中的XmlUtil.readObjectFromXml方法直接封装调用XMLDecoder.readObject解析xml数据,当使用 readObjectFromXml 去处理恶意的 XML 字符串时会造成任意代码执行。 漏洞复现 我们在 maven 仓库中查找 Hutool https://mvnrepository.com/search?…...
Java简单认识泛型——图文详解
写在开头:想必大家和博主一样,在以往学习JavaSE的语法中,遇到了一个陌生的词——泛型,博主当时很好奇,什么是泛型呢?即使是学完了JavaSE,这个问题都没有解决,只能在百度查阅了解关于泛型的一些皮…...
AcWing171.送礼物
题目描述 达达帮翰翰给女生送礼物,翰翰一共准备了NNN 个礼物,其中第 iii 个礼物的重量是 G[i]G[i]G[i]。 达达的力气很大,他一次可以搬动重量之和不超过 WWW 的任意多个物品。 达达希望一次搬掉尽量重的一些物品,请你告诉达达在…...
领域驱动设计-架构篇
目录 1、软件架构概述 1.1 软件架构概念 1.2 软件架构分类 1.3 软件架构模式 1.4 软件架构风格 2、领域驱动软件架构 2.1 架构风格 六边行架构(领域驱动设计首选) 为什么选择REST架构 松耦合 可伸缩性 易用性 约束性 2.2 架构模型 命令和…...
docker安装kafka
前言最近在用kafka做项目,所以本地搭建下kafka,但是又嫌java安装和安装kafka太麻烦,所以想到用docker来部署。镜像wurstmeister/kafka维护较为频繁的一个Kafka镜像。只包含了Kafka,因此需要另行提供ZooKeeper,推荐使用…...
Selenium4+Python3系列(十一) - Page Factory设计模式
写在前面: Page Object模式,目的是将元素定位和元素操作分层,只接触测试内容,不写基础内容,便于后续对自动化测试用例体系的维护,这是中心思想,也是核心。 那么我们继续将简洁延续,…...
C++基础知识【4】函数及参数
目录 一、函数的基本概念 1.1、构成 1.2、声明和定义 1.3、函数的调用 二、参数 2.1、形参和实参 2.2、参数的传递 传值 传引用 传指针 三、C函数的一些新特性 3.1、Lambda表达式 3.2、右值引用 3.3、默认参数 3.4、变长参数模板 3.5、constexpr函数 3.6、noex…...
约瑟夫森磁效应
电流与波函数的相位有直接的关系,可得约瑟夫森结的电流为 IIcsinϕ\begin{align} II_c sin\phi \end{align} IIcsinϕ 式中,IcI_cIc为临界电流,相位差为ϕϕ2−ϕ1\phi\phi_2-\phi_1ϕϕ2−ϕ1。 根据磁矢势A的定义,B…...
什么是L1和L2正则化,以及它们有什么区别
一、L1和L2正则化是什么? 在防止过拟合的方法中有L1正则化和L2正则化,L1和L2是正则化项,又叫做惩罚项,是为了限制模型的参数,防止模型过拟合而加在损失函数后面的一项。 在二维的情况下,黄色的部分是L2和…...
网站维护页面源码/百度竞价推广的技巧
tomcat的安全策略文件 Catalina.policy 当tomcat 运行未知的web应用时,为了防止java代码对服务器系统产生安全影响。比如删除系统文件,重启系统等。需要对java 代码进行安全控制。这时候就要配置这个文件。更加详细资料可以自行学习java 安全管理器 Secu…...
pc网站转wap网站/微商怎么引流被加精准粉
转载于:https://www.cnblogs.com/haojun/p/7018678.html...
成都网络优化网站建设/seo网站关键词优化
第5章 批量插入5.1 批量执行SQL语句5.2 高效的批量插入5.2.1 实现层次一:使用Statement5.2.2 实现层次二:使用PreparedStatement5.2.3 实现层次三5.2.4 实现层次四5.1 批量执行SQL语句 当需要成批插入或者更新记录时,可以采用Java的批量更新…...
wordpress插件聊天室小人/合肥网络推广软件
红色来源于山脉,象征着狂躁、愤怒、混乱,血雨腥风,电光火石。蓝色来源于海岛,象征着控制、幻觉、诡计,运筹帷幄,谋定后动。绿色来源于树林,象征着生命、蛮力、成长,横冲直撞…...
河南省和建设厅网站首页/怎么学seo基础
1.运行时加载优点 提高灵活性,可以在运行时动态加载,连接。例子:面向接口编程,动态绑定实现类(但C也有动态绑定,说明动态绑定不一定通过运行时加载Class字节码实现,也可能是机器码支持的&#x…...
河南做网站高手排名/惠州关键词排名提升
参考文章 https://www.jianshu.com/p/c9b1081215e7 最近,我学习了Flink, 写了个FlinkWordCount。 依赖 这里使用Maven 进行代码管理 : 父Pom <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://mave…...