找出整型数组中占比超过一半的数
问题描述
小R从班级中抽取了一些同学,每位同学都会给出一个数字。已知在这些数字中,某个数字的 出现次数超过了数字总数的一半。现在需要你帮助小R找到这个数字。
测试样例
样例1: 输入:array =[1,3,8,2,3,1,3,3,3] 输出: 3 样例2: 输入:array =[5,5,5,1,2,5,5] 输出:5 样例3: 输入: array =[9,9,9,9,8,9,8,8] 输出: 9
题目解析
这道题最直接、也是相对比较 “笨” 的方法,就是通过统计每个数字在数组中出现的具体次数,然后将每个数字的出现次数与数组长度的一半进行比较,一旦发现某个数字的出现次数大于这个一半的值,就把这个数字作为结果返回,这样就完成了题目的要求。
思路模拟
-
获取数组的一半长度并存为值:
首先,我们需要知道数组长度的一半是多少,因为这是我们后续判断某个数字是否出现次数超过一半的关键比较值。通过获取数组的长度,然后将这个长度除以 2,得到的值就是数组长度的一半。我们可以把这个值存储在一个变量中。
-
使用对数组进行循环:
接下来,我们要对整个数组进行遍历,目的是逐个检查数组中的每个数字。这一步是为了能够对数组中的每一个元素都有机会进行后续的出现次数统计操作。一半就直接用for了
-
然后循环里面进行嵌套子循环:
在对数组进行的外层循环里面,我们需要再嵌套一个子循环。这个子循环的主要目的是针对外层循环当前所指向的那个数字,去统计它在整个数组中出现的具体个数。也就是说,当外层循环迭代到数组中的某个数字时,内层的子循环就会再次遍历整个数组,去查找和当前外层循环所指向的数字相同的其他数字,每找到一个相同的数字,就对其出现次数进行累加统计。
-
嵌套子循环的功能就是进行统计当前父循环所循环到的数字个数:
正如前面所描述的,内层子循环的核心功能就是精确地统计外层循环当前所指向的那个数字在整个数组中的出现次数。通过不断地遍历整个数组,并与当前外层循环所指向的数字进行比较,一旦找到相同的数字,就对统计的次数进行相应的增加。这样,当内层子循环完成一次完整的遍历后,
count
变量中所存储的值就是外层循环当前所指向的数字在整个数组中的准确出现次数。 -
当统计完毕后判断是否大于当前数组一半长度值 如果大于了则进行 return:
当内层子循环完成了对某个数字的出现次数统计后,我们就需要将这个统计得到的出现次数与之前存储的数组长度的一半进行比较。如果发现统计得到的某个数字的出现次数大于数组一半长度值的话,这就意味着这个数字的出现次数超过了数组数字总数的一半,那么它就是我们要找的那个符合题目要求的数字。此时,我们就可以直接将这个数字作为结果返回。
个人解答
def solution(array):
# Edit your code here
arr_len_2 = int(len(array) / 2)
count = 0
result_index = -1
for i in range(len(array)):
count = 0
result_index = -1
for j in range(len(array)):
if array[i]==array[j]:
count+=1
result_index = i
if count > arr_len_2:
return array[result_index]
return 0
if __name__ == "__main__":
# Add your test cases here
print(solution([1, 3, 8, 2, 3, 1, 3, 3, 3]) == 3)
# print(solution([1, 3, 8, 2, 3, 1, 3, 3, 3]))