📜  列表理解 python 3 hackerrank 解决方案 - Python (1)

📅  最后修改于: 2023-12-03 15:22:39.751000             🧑  作者: Mango

列表理解 Python 3 Hackerrank 解决方案

列表理解是 Python 3 中强大且常用的功能之一。它允许我们非常简洁地创建列表,同时在不使用循环的情况下对它们进行转换和过滤。Hackerrank 是一个流行的编程挑战网站,其中包括许多可以使用列表理解来解决的问题。

以下是一些常见的 Hackerrank 问题及其列表理解解决方案的示例。

问题 1:魔方阵

魔方阵是一个正方形数组,其中每一行,每一列和两条对角线上的所有元素之和相等。给定一个 $N\times N$ 魔方阵($1 \leq N \leq 100$),请计算其中所有行,列和对角线上的和,并输出其中的最小值。

输入格式

第一行包含一个整数 $N$,表示数组的大小。

接下来 $N$ 行,每行包含 $N$ 个整数,表示魔方阵的元素。

输出格式

输出所有行,列和对角线的和的最小值。

样例输入
3
4 9 2
3 5 7
8 1 6
样例输出
15
解决方案

我们可以使用列表理解来计算每行、每列和对角线的和。对于任何一个二维列表 arr,我们可以使用以下代码计算第一行的和:

row_sum = sum(arr[0])

要计算每列的和,我们可以使用以下代码:

col_sums = [sum(col) for col in zip(*arr)]

在该代码中,我们使用 zip 函数将列表进行转置,并使用列表理解计算每个转置后的行的和。

对于两条对角线,我们可以使用以下代码:

diag1_sum = sum([arr[i][i] for i in range(n)])
diag2_sum = sum([arr[i][n-i-1] for i in range(n)])

在这两行代码中,我们使用列表理解对角线上的元素进行求和。

最后,计算总和并返回最小值:

total_sums = [row_sum] + col_sums + [diag1_sum, diag2_sum]
min_sum = min(total_sums)
print(min_sum)

这是完整的解决方案的示例代码:

n = int(input())
arr = []

for i in range(n):
    arr.append(list(map(int, input().split())))

row_sum = sum(arr[0])
col_sums = [sum(col) for col in zip(*arr)]
diag1_sum = sum([arr[i][i] for i in range(n)])
diag2_sum = sum([arr[i][n-i-1] for i in range(n)])

total_sums = [row_sum] + col_sums + [diag1_sum, diag2_sum]
min_sum = min(total_sums)
print(min_sum)
问题 2:最大元素之和

给定一个由 $N$ 个非负整数组成的列表($0 \leq N \leq 10^3$),找出其中能够相乘产生的最大和的两个不同元素,并输出它们的和(如果没有这样的一对元素,则输出 -1)。

输入格式

第一行包含一个整数 $N$,表示列表的大小。

接下来 $N$ 行,每行包含一个非负整数。

输出格式

输出能够相乘产生的最大和的两个不同元素的和。

样例输入
5
2
5
3
4
6
样例输出
30
解决方案

我们可以使用列表理解来查找相乘产生最大值的元素对。对于任何一个列表 lst,可以使用以下代码来查找它们的和:

max_idx = max(range(len(lst)), key=lst.__getitem__)
max1 = lst[max_idx]
lst[max_idx] = 0
max_idx = max(range(len(lst)), key=lst.__getitem__)
max2 = lst[max_idx]

if max1 == 0 or max2 == 0:
    print(-1)
else:
    print(max1 + max2)

这段代码将找到具有最大值和次大值的元素对,并检查它们的乘积是否为零。如果一个元素为零,则最大的乘积为零,并且该算法输出 -1。

以下是完整的解决方案代码:

n = int(input())
lst = []

for i in range(n):
    lst.append(int(input()))

max_idx = max(range(len(lst)), key=lst.__getitem__)
max1 = lst[max_idx]
lst[max_idx] = 0
max_idx = max(range(len(lst)), key=lst.__getitem__)
max2 = lst[max_idx]

if max1 == 0 or max2 == 0:
    print(-1)
else:
    print(max1 + max2)
问题 3:销售量排行榜

您正在管理一个线下商店,并希望查看每个销售员的销售量排行榜。您已经记录了每个销售员的销售数据,现在希望统计并输出他们的总销售量,并按降序对其进行排序。

输入格式

第一行包含一个整数 $N$,表示销售员的数量。

接下来 $N$ 行,每行包含一个字符串 $name_i$ 和一个整数 $sales_i$,表示销售员的姓名和销售量。

输出格式

输出排序后的销售员名称和他们的总销售量。

样例输入
4
Alice 10
Bob 5
Charlie 15
David 8
样例输出
Charlie 15
Alice 10
David 8
Bob 5
解决方案

我们可以使用列表理解来计算每个销售员的总销售量,并按降序对其进行排序。以下是这个问题的解决方案:

n = int(input())
sales = []

for i in range(n):
    name, amt = input().split()
    sales.append((name, int(amt)))

sales.sort(key=lambda x: x[1], reverse=True)

for name, amt in sales:
    print("{} {}".format(name, amt))

在这个解决方案中,我们使用 sort 函数来对列表进行排序,并使用 lambda 表达式指定按照每个销售员的总销售量进行排序。

完整的程序如下:

n = int(input())
sales = []

for i in range(n):
    name, amt = input().split()
    sales.append((name, int(amt)))

sales.sort(key=lambda x: x[1], reverse=True)

for name, amt in sales:
    print("{} {}".format(name, amt))

这是列表理解在 Hackerrank 上解决常见问题的例子。通过使用列表理解,我们可以编写简单、优雅和高效的代码。