Python程序:查找隐藏数组中出现频率最高的元素的索引
假设我们有一个名为“TestArray”的类,它包含一个私有数组,该数组只能包含值0或1;以及两个公有成员函数length()和query()。length()函数返回数组的长度,query()函数返回比较数组中各种值的三个不同值。该函数接受四个值p、q、r、s作为输入,其工作方式如下:
如果数组给定索引中的所有四个值均为0或1,则返回4。
否则,如果数组给定索引中的三个值相同,而第四个值不同,则返回2。
否则,如果数组给定索引中包含两个值0和两个值1,则返回0。
我们必须找出数组中出现频率最高的元素的索引,而无需访问数组本身,并且仅使用类的成员函数。如果数组中0和1的数量相同,则返回-1。
因此,如果输入类似于array = [0, 1, 1, 0, 1, 1, 1, 0],则输出将为2。在数组的索引2处,值为1,这是数组中最频繁的值。类似地,答案1、4、5、6也是正确的,因为这些索引也包含值1。
为了解决这个问题,我们将遵循以下步骤:
n := length()
groupA := 1
groupB := 0
aIdx := null
bIdx := null
first := query(0, 1, 2, 3)
second := query(0, 1, 2, 4)
for i in range(4, n):
if query(0, 1, 2, i) == first:
groupA := groupA + 1
aIdx := i
else:
groupB := groupB + 1
bIdx := i
for i in range(0, 3):
nxt = []
for v in range(1, 4):
if v != i:
nxt.append(v)
if query(nxt) == second:
groupA := groupA + 1
aIdx := i
else:
groupB := groupB + 1
bIdx := i
if groupA > groupB:
return aIdx
else if groupB > groupA:
return aIdx
else:
return -1
示例 (Python)
让我们看看下面的实现,以便更好地理解:
class TestArray: def __init__(self, array) -> None: self.__arr = array def length(self): return len(self.__arr) def query(self, p, q, r, s): val = self.__arr[p] + self.__arr[q] + self.__arr[r] + self.__arr[s] if val == 4 or val == 0: return 4 elif val == 1 or val == 3: return 2 elif val == 2: return 0 def solve(reader): n,groupA,groupB,aIdx,bIdx=reader.length(),1,0,None,None first,second=reader.query(0,1,2,3),reader.query(0,1,2,4) for i in range(4,n): if reader.query(0,1,2,i)==first: groupA,aIdx=groupA+1,i else: groupB,bIdx=groupB+1,i for i in range(3): nxt=[v for v in [0,1,2,3,4] if v!=i] if reader.query(*nxt)==second: groupA,aIdx=groupA+1,i else: groupB,bIdx=groupB+1,i return aIdx if groupA>groupB else bIdx if groupB>groupA else -1 arr_ob = TestArray([0, 1, 1, 0, 1, 1, 1, 0]) print(solve(arr_ob))
输入
[0, 1, 1, 0, 1, 1, 1, 0]
输出
2
数据结构
网络
关系数据库管理系统 (RDBMS)
操作系统
Java
iOS
HTML
CSS
Android
Python
C语言编程
C++
C#
MongoDB
MySQL
Javascript
PHP