给定一系列正整数,请设计一个尽可能高效的算法,查找倒数第k个位置上的数字。 输入格式: 输入首先给出一个正整数k,随后是若干非负整数,最后以一个负整数表示结尾(该负数不算在序列内,不要处理)。 输出格式: 输出倒数第k个位置上的数据。如果这个位置不存在,输出错误信息null。
时间: 2023-05-31 21:19:52 浏览: 115
链表查找倒数第K个数
### 回答1:
算法思路:
可以使用双指针法,让一个指针先走k步,然后两个指针同时向后移动,直到第一个指针到达末尾,此时第二个指针所指的位置就是倒数第k个位置。
代码实现:
```python
k = int(input())
nums = []
while True:
num = int(input())
if num < :
break
nums.append(num)
if k > len(nums):
print("null")
else:
p1, p2 = , k
while p2 < len(nums):
p1 += 1
p2 += 1
print(nums[p1])
```
时间复杂度:O(n),其中n为输入的非负整数的个数。
### 回答2:
题目分析
此题实际上是在给定的一系列正整数中,倒数第 k 个位置上的数字,我们可以把这些数字逆序排序,然后找出第 k 个数字即可。
实现步骤
- 读入数据,将所有非负整数存入一个数组中。
- 定义一个变量 cnt,用于记录数组中的元素个数。
- 逆序排序数组中的元素。
- 判断 k 是否超出数组长度范围,如果超出则输出错误信息 null。
- 输出数组中第 k 个元素的值。
代码实现
下面是用 Python 语言实现的代码:
k = int(input())
a = []
cnt = 0
while True:
x = int(input())
if x < 0:
break
a.append(x)
cnt += 1
a.sort(reverse=True)
if k > cnt:
print("null")
else:
print(a[k-1])
时间复杂度分析
代码中的主要操作是将数组中的元素进行逆序排序,时间复杂度为 O(nlogn),其中 n 是数组的元素个数。因此,算法的时间复杂度为 O(nlogn)。
### 回答3:
思路:
本问题可以采用两个指针,一前一后的方式进行查找,即快慢指针。
首先设置两个指针,快指针先走k步,然后慢指针和快指针同时前进,当快指针到达结束位置即负数时,慢指针指向的位置即为要查找的数。
需要注意的是,当输入的数据个数不足k时,即快指针没有走完k步,直接输出错误信息null。
代码实现如下:
C++ 代码:
#include <iostream>
using namespace std;
int main() {
int k;
cin >> k;
int num, cnt = 0;
int res;
while(cin >> num && num >= 0) {
cnt++;
if(cnt == k) {
res = num;
}
}
if(cnt < k) {
cout << "null" << endl;
} else {
cout << res << endl;
}
return 0;
}
Python 代码:
k = int(input())
nums = input().split()
nums.pop()
cnt = 0
for i in range(k-1):
nums.pop(0)
if len(nums) == 0:
print("null")
else:
print(nums[0])
阅读全文