每日一练——7-19 求链式线性表的倒数第K项(20 分)

244 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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: 我又双叒叕被坑了,我直接好家伙,有个测试点我卡爆了,先给大家看看~ image.png
我真的想笑,后来啊,我重新审阅了一下题目: image.png
把-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;
    }
}

逆序结果:

image.png

正序思路:

  • 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;
    }
}

正序结果:

image.png

正序和逆序分析:

对于正序和逆序时间优劣的关系在于k的值,k的值关系到迭代器的移动

  • 若k的值比较大,对逆序比较有利
  • 若k的值比较小,对正序比较有利
  • 所以 我们需要根据具体情况来使用算法~ PS: 解题完成~