cin和scanf

今天刷着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");
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值