📅  最后修改于: 2023-12-03 15:22:39.751000             🧑  作者: Mango
列表理解是 Python 3 中强大且常用的功能之一。它允许我们非常简洁地创建列表,同时在不使用循环的情况下对它们进行转换和过滤。Hackerrank 是一个流行的编程挑战网站,其中包括许多可以使用列表理解来解决的问题。
以下是一些常见的 Hackerrank 问题及其列表理解解决方案的示例。
魔方阵是一个正方形数组,其中每一行,每一列和两条对角线上的所有元素之和相等。给定一个 $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)
给定一个由 $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)
您正在管理一个线下商店,并希望查看每个销售员的销售量排行榜。您已经记录了每个销售员的销售数据,现在希望统计并输出他们的总销售量,并按降序对其进行排序。
第一行包含一个整数 $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 上解决常见问题的例子。通过使用列表理解,我们可以编写简单、优雅和高效的代码。