今天刷着PTA的数据结构与算法题目集,遇到一道题如下:
7-19 求链式线性表的倒数第K项(20 分)
给定一系列正整数,请设计一个尽可能高效的算法,查找倒数第K个位置上的数字。
输入格式:
输入首先给出一个正整数K,随后是若干正整数,最后以一个负整数表示结尾(该负数不算在序列内,不要处理)。
输出格式:
输出倒数第K个位置上的数据。如果这个位置不存在,输出错误信息NULL
。
最开始是用STL vector ,(因为最近才学C++,想学以致用来着)结果超时了。后来发现其实不必把输入中的所有值储存下来,只需储存当前输入的后k个,于是只需要用一个大小为k+1的数组。
选定数据的储存方式之后,我的第一个思路是用滑动窗口的形式去记录输入。但转念一想,这样会有大量的数据移动操作,十分浪费。最后受到循环队列的启发,用类似的方式去记录输入。这样不管是空间上还是时间上都应该是理论上最为节省的。因为记录当前输入的后k个是必须的,否则就不能正确找到倒数第k个是谁。
但居然超时了。。。难道还有更好的算法???抱着不信邪的心态去查了查,也没有发现更节省时间的方法。
自暴自弃的把程序再用C重写了一遍,提交,居然过了。。。。
坑爹的判题系统和出题人啊。。。又试了试,发现用cin(C++)的话,连数据都读不完就TL。而用scanf(C),却能够在规定时间内完成输入。
哎,今天一晚都贴给这破题了。。。服气
代码:
#include <stdio.h>
// using namespace std;
int main () {
int t,k;
scanf("%d",&k);
int *a=(int*)malloc((k+1)*sizeof(int)),i=0,flag=0;
while (scanf("%d",&t)) {
a[i++] = t;
if (i==k+1) {
i = 0;
flag = 1;
}
if (t<0) break;
}
if (flag) printf("%d",a[i%(k+1)]);
else printf("NULL");
}