持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第25天,点击查看活动详情
题目分析:
给定一系列正整数,请设计一个尽可能高效的算法,查找倒数第K个位置上的数字。
输入格式:
输入首先给出一个正整数K,随后是若干非负整数,最后以一个负整数表示结尾(该负数不算在序列内,不要处理)。
输出格式:
输出倒数第K个位置上的数据。如果这个位置不存在,输出错误信息NULL。
输入样例:
4 1 2 3 4 5 6 7 8 9 0 -1
输出样例:
7
代码长度限制 16 KB
时间限制 400 ms
内存限制 64 MB
PS:
我又双叒叕被坑了,我直接好家伙,有个测试点我卡爆了,先给大家看看~
我真的想笑,后来啊,我重新审阅了一下题目:
把-1当做代码结束条件的评论区吱个声;好了言归正传,讲一下题目,两种思路
逆序思路:
- 1.创建一个list链表,将数字不断地尾插到list中
- 2.倒数k个数就是list.size()-k
- 3.创建迭代器,不断地找到list.size()-k的位置上
- 4.输出
逆序代码:
#include<iostream>
#include<list>
using namespace std;
int main()
{
int k;
cin >> k;
int x;
list<int>L;
cin >> x;
while (x >= 0) {
//尾插
L.push_back(x);
cin >> x;
}
int len = L.size();
if (k > len)
cout << "NULL";
else {
//迭代器不断移动
list<int>::iterator it = L.begin();
for (int i = 0; i < len - k; i++)
it++;
cout << *it;
}
}
逆序结果:
正序思路:
- 1.创建一个list链表,将数字不断地头插到list中
- 2.倒数k个数其实就是顺数的k个数
- 3.创建迭代器,不断地找到k的位置上
- 4.输出
正序代码:
#include<iostream>
#include<list>
using namespace std;
int main()
{
int k;
cin >> k;
int x;
list<int>L;
cin >> x;
while (x >= 0) {
//头插
L.push_front(x);
cin >> x;
}
int len = L.size();
if (k > len)
cout << "NULL";
else {
//迭代器不断移动
list<int>::iterator it = L.begin();
for (int i = 0; i < k - 1; i++)
it++;
cout << *it;
}
}
正序结果:
正序和逆序分析:
对于正序和逆序时间优劣的关系在于k的值,k的值关系到迭代器的移动
- 若k的值比较大,对逆序比较有利
- 若k的值比较小,对正序比较有利
- 所以 我们需要根据具体情况来使用算法~ PS: 解题完成~