📅  最后修改于: 2023-12-03 15:37:15.942000             🧑  作者: Mango
这是ISRO CS 2018编程考试中的第35个问题,题目如下:
给定一个数组A 由n个整数组成,数组未排序。 从元素a [0]开始,您必须执行以下操作:
如果a [i]为奇数,则a [i] = a [i] - a [i + 1]
如果a [i]为偶数,则a [i] = a [i] + a [i + 1]
您需要执行这些操作,直到a [i]和a [i + 1]都大于或等于n。
您的任务是找到进行操作的次数。
输入描述:
第一行包含单个整数T,表示测试用例的数量。每个测试用例的第一行包含一个整数n,表示数组的大小。每个测试用例的第二行包含n个以空格分隔的整数。
输出描述:
对于每个测试用例,在新行中,打印要执行的操作次数。
示例:
输入:
2
6
9 7 5 3 1 8
4
1 3 5 7
输出:
4
0
这道题目的思路很简单,就是模拟题意中的操作过程,直到不能再进行操作。但是需要注意几点:
当数组中的所有元素都为偶数或奇数时,不能再进行操作。
注意数组越界问题。
判断奇偶可以使用 x & 1 == 1 或者 x % 2 == 1 等方式。
代码如下:
def solve(n, a):
cnt = 0
for i in range(n-1):
if a[i] >= n or a[i+1] >= n:
break
if i % 2 == 0:
if a[i] & 1 == 1:
a[i] -= a[i+1]
cnt += 1
if a[i+1] & 1 == 1:
a[i+1] -= a[i+2]
cnt += 1
else:
if a[i] % 2 == 0:
a[i] += a[i+1]
cnt += 1
if a[i+1] % 2 == 0:
a[i+1] += a[i+2]
cnt += 1
return cnt
t = int(input())
for _ in range(t):
n = int(input())
a = list(map(int, input().split()))
print(solve(n, a))
该代码的时间复杂度为O(n),可以通过此题。