PTA数据结构与算法题目集(中文) 7-19
7-19 求链式线性表的倒数第K项 (20 分)
给定一系列正整数,请设计一个尽可能高效的算法,查找倒数第K个位置上的数字。
输入格式:
输入首先给出一个正整数K,随后是若干正整数,最后以一个负整数表示结尾(该负数不算在序列内,不要处理)。
输出格式:
输出倒数第K个位置上的数据。如果这个位置不存在,输出错误信息NULL
。
输入样例:
4 1 2 3 4 5 6 7 8 9 0 -1
输出样例:
7
题目分析:看到高效就想用数组来 因为数组按秩查找是相当快的 后面搜了一下别人的做法 更好
1 #define _CRT_SECURE_NO_WARNINGS 2 #include<stdio.h> 3 #include<malloc.h> 4 5 int Size; 6 int main() 7 { 8 int k; 9 int*Array = (int*)malloc(sizeof(int) * 1000000); 10 scanf("%d", &k); 11 while (1) 12 { 13 int num; 14 scanf("%d", &num); 15 if (num == -1) 16 break; 17 Array[Size++] = num; 18 } 19 k = Size - k; 20 if (k <0||k>=Size) 21 printf("NULL"); 22 else 23 printf("%d", Array[k]); 24 free(Array); 25 return 0; 26 }
别人的做法
1 #define _CRT_SECURE_NO_WARNINGS 2 #include<stdio.h> 3 #include<malloc.h> 4 5 6 int main() 7 { 8 int k=0; 9 int Size=0; 10 scanf("%d", &k); 11 if (k <=0) 12 { 13 printf("NULL"); 14 return 0; 15 } 16 int*Array = (int*)malloc(sizeof(int) * k); //只需存k个数 17 int Flag = 0; 18 while (1) 19 { 20 int num; 21 scanf("%d", &num); 22 if (num == -1) //当输入为-1时退出 23 break; 24 Array[Size++] = num; 25 if (!Flag && Size >= k) 26 Flag = 1; 27 Size%=k; 28 } 29 if (!Flag) 30 printf("NULL"); 31 else 32 printf("%d", Array[Size]); 33 free(Array); 34 return 0; 35 }