【发布时间】:2018-03-12 18:14:24
【问题描述】:
我想优化我制作的以下代码,以便它通过hackerrank问题中的所有测试用例。它目前有效,但由于超时而在某些情况下失败。你能指导我如何在不改变概念的情况下优化代码吗?
问题
Alice 正在玩街机游戏,并想爬到排行榜的顶端。 当她通过每个级别时,你能帮助她跟踪她的排名吗?游戏使用密集排名,所以它的排行榜是这样工作的:
• 得分最高的玩家在排行榜上排名第一。
• 得分相同的玩家获得相同的排名编号,下一位玩家获得紧随其后的排名编号。
例如,四个玩家的分数分别为 100、90、90 和 80。这些玩家的排名分别为 1、2、2 和 3。
当 Alice 开始玩游戏时,排行榜上已经有
n人。 Alice 玩m级别,我们表示她通过每个级别后的总分。完成每个级别后,Alice 想知道她当前的排名。您将获得一组单调递减的排行榜分数,以及另一组 Alice 在每个级别的游戏中的累积分数。必须打印整数:整数应该表示 Alice 通过每一级后的当前等级。
输入格式:
- 第一行包含一个整数
n,表示已经在排行榜上的玩家数量。- 下一行包含
n用空格分隔的整数,描述它们各自的得分值。- 下一行包含一个整数
m,表示Alice 击败的级别数。- 最后一行包含
m以空格分隔的整数,描述每个玩家的各自值。输出格式:
打印整数。整数应该表示 Alice 通过每一关后的排名。
输入
7
100 100 50 40 40 20 10
4
5 25 50 120
输出
6
4
2
1
这是我的代码:
#include <math.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct player {
int rank;
int score;
};
struct node {
struct player data;
struct node *next;
};
int main() {
int n, i, m, temp, count = 1, x;
struct node *ptr, *head;
head = (struct node *)malloc(sizeof(struct node));
ptr = head;
scanf("%d", &n);
for (i = 0; i < n; i++) {
scanf("%d", &x);
ptr->data.score = x;
if (x < temp)
count++;
ptr->data.rank = count;
temp = ptr->data.score;
ptr->next = (struct node *)malloc(sizeof(struct node));
ptr = ptr->next;
}
ptr = NULL;
ptr = head;
scanf("%d", &m);
for (i = 0; i < m; i++) {
scanf(" %d", &x);
while (x < ptr->data.score)
ptr = ptr->next;
if (ptr->next == NULL)
ptr->data.rank = count + 1;
printf("%d\n", ptr->data.rank);
ptr = head;
}
return 0;
}
问题在于,每次我为 Alice 取出排名时,我都是从头开始遍历链表。对此有什么可能的优化?
【问题讨论】:
-
这类问题的重点不一定只是为了写出高效的代码,而是要找到一个聪明的算法。 那是你必须解决的真正挑战。
-
我知道。我试过了,但我无法使用链接列表来解决我的问题。所以,如果你能帮我一点忙,那就太好了。 :) 可以通过使用堆栈来解决问题,但我只想使用链表。
-
残酷 - 如果你不能解决它,尝试另一个挑战。该站点不是解决我的挑战的站点,而是针对 C 的特定问题。
-
我会继续尝试其他挑战,但这并不是我在 stackoverflow 上发帖的真正目的,是吗?
-
我的回答是,如果我能解决问题,我会直接提交给 Hackerrank,而不是给你。如果我不能解决它,我会把问题放在一边,稍后再回来。
标签: c algorithm data-structures linked-list