欢乐的跳

题目描述

一个 nn 个元素的整数数组,如果数组两个连续元素之间差的绝对值包括了 [1,n1][1,n-1] 之间的所有整数,则称之符合“欢乐的跳”,如数组 {1,4,2,3}\{1,4,2,3\} 符合“欢乐的跳”,因为差的绝对值分别为:3,2,13,2,1

给定一个数组,你的任务是判断该数组是否符合“欢乐的跳”。

输入格式

每组测试数据第一行以一个整数 n(1n1000)n(1 \le n \le 1000) 开始,接下来 nn 个空格隔开的在 [108,108][-10^8,10^8] 之间的整数。

输出格式

对于每组测试数据,输出一行若该数组符合“欢乐的跳”则输出 Jolly,否则输出 Not jolly

样例 #1

样例输入 #1

1
4 1 4 2 3

样例输出 #1

1
Jolly

样例 #2

样例输入 #2

1
5 1 4 2 -1 6

样例输出 #2

1
Not jolly

提示

1n10001 \le n \le 1000

题解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Jolly_input = list(map(int, input().split()))
n = Jolly_input[0]
Jolly = []
for i in range(1, len(Jolly_input)):
Jolly.append(Jolly_input[i])
w1 = [0] * n
for i in range(n - 1):
abs_num = abs(Jolly[i] - Jolly[i + 1])
if abs_num < n:
w1[abs_num] = 1

count = 0
for i in w1[1:]:
if i == 0:
count = 1
if count == 0:
print("Jolly")
else:
print("Not jolly")

题解优化1

这段代码已经实现了判断数组是否符合“欢乐的跳”的功能,但仍然可以进行一些优化:

  1. 简化列表创建:在创建 Jolly 列表时,可以使用切片来简化代码。

  2. 简化差的绝对值计算:可以在循环中直接计算差的绝对值,而不是使用 abs() 函数。

  3. 简化检查逻辑:可以在循环中直接检查是否存在未被标记的差的绝对值,而不是使用计数器 count

  4. 使用生成器表达式:在最后判断是否存在未被标记的差的绝对值时,可以使用生成器表达式来判断,而不需要显式地创建一个计数器变量。

下面是优化后的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Jolly_input = list(map(int, input().split()))
n = Jolly_input[0]
Jolly = Jolly_input[1:] # 简化列表创建

w1 = [0] * n

for i in range(n - 1):
abs_num = abs(Jolly[i] - Jolly[i + 1])
if abs_num < n:
w1[abs_num] = 1

if 0 in w1[1:]: # 使用生成器表达式检查是否存在未被标记的差的绝对值
print("Not jolly")
else:
print("Jolly")

通过这些优化,代码更加简洁和易读。

题解优化2

这段代码可以进行一些优化,提高效率和简洁性。下面是一些可能的优化点:

  1. 不需要额外的 Jolly 列表: 可以在读取输入时直接忽略第一个元素,因为我们只关心元素之间的差值。

  2. 不需要检查是否小于 n: 因为题目规定了连续元素之间的差的绝对值不超过 n-1,所以无需检查差的绝对值是否小于 n。

  3. 不需要额外的计数器 count: 可以直接利用 w1 列表来判断是否存在未被标记的差的绝对值。

  4. 优化遍历 w1 列表的方式: 可以使用 Python 的内置函数 any() 来判断列表中是否存在某个条件成立的元素。

下面是优化后的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
Jolly_input = list(map(int, input().split()))
n = Jolly_input[0]

w1 = [0] * n

for i in range(1, n):
abs_num = abs(Jolly_input[i] - Jolly_input[i + 1])
w1[abs_num] = 1

if any(i == 0 for i in w1[1:]):
print("Not jolly")
else:
print("Jolly")

这样,我们消除了额外的 Jolly 列表、计数器 count,并且更简洁地判断是否存在未被标记的差的绝对值。

题解解释

来自ChatGPT

这段代码用于判断给定的整数数组是否符合“欢乐的跳”的条件。下面是代码的解释:

  1. Jolly_input = list(map(int, input().split())): 这行代码接受用户输入的整数数组,并将其转换为整数列表。

  2. n = Jolly_input[0]: 获取输入列表的第一个元素,该元素表示数组的长度。

  3. Jolly = []: 创建一个空列表 Jolly 用于存储输入列表中除了第一个元素以外的所有元素。

  4. for i in range(1, len(Jolly_input)): Jolly.append(Jolly_input[i]): 这个循环将输入列表中除了第一个元素以外的所有元素添加到 Jolly 列表中。

  5. w1 = [0] * n: 创建一个长度为 n 的全零列表 w1,用于记录数组中差的绝对值。

  6. for i in range(n - 1):: 这个循环遍历数组中的每对连续元素。

  7. abs_num = abs(Jolly[i] - Jolly[i + 1]): 计算当前元素和下一个元素的差的绝对值。

  8. if abs_num < n: w1[abs_num] = 1: 如果差的绝对值小于 n,则将 w1 列表中索引为差的绝对值的元素标记为 1,表示该差的绝对值出现过。

  9. count = 0: 初始化一个计数器 count 为 0,用于检查是否存在欢乐的跳。

  10. for i in w1[1:]:: 这个循环遍历 w1 列表中除了第一个元素以外的所有元素。

  11. if i == 0: count = 1: 如果 w1 中有任何一个元素为 0,说明存在未被标记的差的绝对值,将 count 设置为 1。

  12. if count == 0: print("Jolly") else: print("Not jolly"): 最后,根据 count 的值判断是否存在欢乐的跳,如果 count 为 0,表示所有的差的绝对值都被标记过,输出 “Jolly”,否则输出 “Not jolly”。

综上所述,这段代码通过记录数组中差的绝对值是否被标记过来判断数组是否符合“欢乐的跳”的条件。

知识点

  • list(map(int, input().split()))接受有空格间隔的连续输入

  • 通过切片来进行列表的自定义索引循环

如果你想循环一个列表,并从索引 1 开始而不是从索引 0 开始,你可以使用 Python 中的切片。切片允许你从列表中选择一个子序列。对于循环来说,你可以使用切片来创建一个新的列表,从索引 1 开始,然后对这个新列表进行迭代。

例如:

1
2
3
4
5
my_list = [10, 20, 30, 40, 50]

# 从索引 1 开始循环
for item in my_list[1:]:
print(item)

在这个例子中,my_list[1:] 创建了一个新列表,其中包含从索引 1 到列表末尾的所有元素。然后,for 循环遍历这个新列表。这样就可以从索引 1 开始循环遍历原始列表了。

注意:使用切片创建的是原列表的副本,因此对新列表的修改不会影响原列表。

  • if的灵活运用
1
if 0 in w1[1:]:  # 使用生成器表达式检查是否存在未被标记的差的绝对值
  • if和any函数结合
1
if any(i == 0 for i in w1[1:]):
  • any函数

any() 函数是 Python 中的一个内置函数,它用于检查可迭代对象中是否存在任何为真(即非零、非空、非空字符串、非空列表等)的元素。如果可迭代对象中至少有一个元素为真,则返回 True;否则,返回 False

以下是 any() 函数的基本语法:

1
any(iterable)

其中,iterable 是一个可迭代对象,比如列表、元组、集合、字典的键等。

举个例子,假设我们有一个列表,想要检查其中是否有任何元素为偶数:

1
2
3
my_list = [1, 3, 5, 6, 7]
result = any(x % 2 == 0 for x in my_list)
print(result) # 输出: True,因为列表中存在偶数 6

在这个例子中,我们使用了生成器表达式来生成一个布尔值的迭代器,然后将其传递给 any() 函数。这个迭代器会遍历列表中的每个元素,检查它是否为偶数。因为列表中存在偶数 6,所以 any() 函数返回 True

any() 函数通常用于在条件中检查多个布尔值,以简化代码逻辑。

碎碎念

嗓子好疼,好困,今天就学到这吧,就刷了一道题