罕见的python问题,似乎没在题解里见到,管理员如果觉得有价值可以放进去
查看原帖
罕见的python问题,似乎没在题解里见到,管理员如果觉得有价值可以放进去
96137
Neoomgg楼主2024/1/17 23:43

首先题本身的逻辑不复杂,最直接的采取冒泡计数/模拟冒泡都可以解决。

但python的问题就出在输入格式里了:

第二行是 N 个不同的数表示初始的车厢顺序。 (注:实际上数据中并不都在同一行,有可能分行输入)

为什么python会出现问题但是c++不会?这里让我们引用chatgpt的一段解释:

  1. 输入流机制:C++ 使用 cin 流来读取输入,它可以连续读取多个值,直到输入流结束。这意味着,无论输入是分行还是在同一行,cin 都会自动处理并连续读取下一个值。例如,您可以使用 while (cin >> value) 来连续读取值,直到没有更多输入。

  2. 格式更宽松:在 C++ 中,当使用 cin 读取数据时,它会自动跳过空白字符(包括空格和换行符)。这使得处理分行或同行的输入变得更加直接,因为 cin 会持续读取直到遇到非空白字符。

  3. 类型安全和直接性:C++ 在类型安全和直接处理数据方面较为严格,这意味着如果您尝试读取与预期类型不匹配的数据,程序将会产生错误或异常行为。这种严格性有助于避免某些类型的输入错误。

例如,在 C++ 中,您可以使用以下代码来读取一系列整数,无论它们是在单行中还是分布在多个行中:

int n;

cin >> n;

vector<int> arr(n);
  
for(int i = 0; i < n; ++i) {
	cin >> arr[i]; 
}

在这段代码中,cin 会自动处理空格和换行符,并连续读取 n 个整数到数组 arr 中。由于 C++ 的输入流机制,这段代码不需要担心输入是分行还是同行。

相比之下,Python 在处理输入时更加灵活,但也因此需要更多的明确指示来正确解析和处理复杂的输入格式。

我并没有一次就通过,而是尝试了数次,先贴出ac的解决方案(个人不认为这是题解/答案,只是特别语言碰到的题目考查范围外的内容):

arr = []
c = 0
while c < n:
    line = list(map(int, input().split()))
    arr.extend(line)
    c += len(line)
##arr = arr[:n] (没有必要但是严谨

30分(很久很久以前写的)——

arr = list(map(int, input().split()))

完全忽略了题目格式,只考虑了空格分开数据。查看题解也没解决方案。一直以为问题出现在后续代码里,但尝试了更高效的算法也未能解决。


70分——

first_line = input().strip()
if ' ' in input_line:
    arr = list(map(int, first_line.split()))
else:
    arr = [int(first_line)]
    for _ in range(1, n):
        arr.append(int(input()))

只考虑了要么第一行空格输入,要么换行输入的情况。


50分——

remaining_input = ' '.join([input() for _ in range(n)])
arr = list(map(int, remaining_input.split()))

chatgpt提供。问题出在了循环n遍,即默认输入n行。


100分——

arr = []
c = 0
while c < n:
    line = list(map(int, input().split()))
    arr.extend(line)
    c += len(line)

正确考虑了空格和换行交替出现的问题,同时对已经统计的数进行计数,确保在读取完数据后正确的结束读取。

以上。

2024/1/17 23:43
加载中...