给定一系列正整数,请设计一个尽可能高效的算法,查找倒数第K个位置上的数字。
输入格式:
输入首先给出一个正整数K,随后是若干非负整数,最后以一个负整数表示结尾(该负数不算在序列内,不要处理)。
输出格式:
输出倒数第K个位置上的数据。如果这个位置不存在,输出错误信息NULL
。
输入样例:
4 1 2 3 4 5 6 7 8 9 0 -1
输出样例:
7
思路:编程题思路很多,可以定义一个数组,数组的长度大小可以很大,将数据存入数组中,定义一个len指向有效数据的个数,最后输出len-k位置上的数。当然这样有点浪费空间偷懒hhh,我写博客的时候想到的。
代码:代码的实现给两种方法。(第二种还没交到PTA上试过,写博客的时候想到的)
代码一(C):
/* 1-6 求链式线性表的倒数第K项 */
/* Asunne */
/* 2022/12/18 */
#include <stdio.h>
#include <stdlib.h>
typedef int ElementType;
/* 链表结点的定义 */
typedef struct Node *PtrToNode;
struct Node
{
ElementType data;
PtrToNode Next;
};
typedef PtrToNode List;
int main()
{
List L = NULL;
PtrToNode p;
int K;
int data;
int count = 0;
scanf("%d", &K);
scanf("%d", &data);
/* 头插法,查找倒数第K个元素即是查找正数第K-1个元素 */
while (data >= 0)
{
p = (PtrToNode)malloc(sizeof(PtrToNode));
p->data = data;
scanf("%d", &data);
p->Next = L;
L = p;
count++;
}
p = L;
if(count < K)
printf("NULL");
else
for(int i = 0; i<K-1;i++)
p = p->Next;
printf("%d ",p->data);
return 0;
}
代码二(C++)(偷懒)
/* 1-6 求链式线性表的倒数第K项 */
/* Asunne */
/* 2022/12/18 */
#include <bits/stdc++.h>
using namespace std;
#define MAXNum 100001
int main()
{
int A[MAXNum];
int data;
int K;
int len = 0;
int i;
cin >> K >> data;
while (data >= 0)
{
A[len] = data;
len++;
cin >> data;
}
if (len >= K)
cout << A[len - K] << endl;
else
cout << "NULL" << endl;
}