题目描述

数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。

思路:

第一种思路:
出现次数超过一半的数字,不管如何,必然这个数字位于数组中间的位置,因此可以采用类似于快排的划分的方法,找到位于数组中间的位置的数字,然后在顺序检索是否这个数字出现次数超过一半。

def function_partion(lists, left, right):
# 划分函数处理部分
key = lists[left]
while left < right:
while left < right and lists[right] >= key:
right -= 1
lists[left] = lists[right]
while left < right and lists[left] <= key:
left += 1
lists[right] = lists[left]
lists[right] = key
return left def function(lists):
# 划分法主要函数部分
length = len(lists)
left = 0
right = length - 1
index = function_partion(lists, left, right)
k = length//2
while k != index:
if index > k - 1:
right = index - 1
else:
left = index + 1
index = function_partion(lists, left, right)
return lists[k-1] lists = [1, 2, 3, 2, 2, 2, 5, 4, 2]
print("思路(划分法):", function(lists))
 
第二种思路:
根据数组的特点,出现次数超过一半的数,他出现的次数比其他数字出现的总和还要多,因此可以最开始保存两个数值:数组中的一个数字以及它出现的次数,然后遍历,如果下一个数字等于这个数字,那么次数加一,如果不等,次数减一,当次数等于0的时候,在下一个数字的时候重新复制新的数字以及出现的次数置为1,直到进行到最后,然后再验证最后留下的数字是否出现次数超过一半,因为可能前面的次数依次抵消掉,最后一个数字就直接是保留下来的数字,但是出现次数不一定超过一半。
# -*- coding:utf-8 -*-

class Solution:
def MoreThanHalfNum_Solution(self, numbers):
if (numbers is None or len(numbers) == 0):
return 0
current = numbers[0]
flag = 1
for i in numbers[1:]:
if (i != current):
flag -= 1
else:
flag += 1
if (flag == 0):
current = i
flag = 1
if (flag >= 1):
count = 0
for i in numbers:
if (current == i):
count += 1
if (count > len(numbers)//2):
return current
return 0

第三种思路:

  1. 把代码量更短的代码放在前面,以裱门面…
  2. 用字典(键值对)实现。键存放数组中出现的数字,值存放对应数字出现的次数。
def MoreThanHalfNum_Solution(self, numbers):
dict = {}
for num in numbers:
dict[num] = 1 if num not in dict else dict[num]+1
if dict[num] > len(numbers)/2:
return num
return 0

python剑指offer数组中出现次数超过一半的数字的更多相关文章

  1. 剑指Offer——数组中出现次数超过一半的数字

    题目描述: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2 ...

  2. 剑指Offer——数组中出现次数超过一半的数字——一题多解

    看题目: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. ...

  3. 用js刷剑指offer(数组中出现次数超过一半的数字)

    题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. ...

  4. 剑指offer——数组中出现次数超过一半的数字(c++)

    题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2.如 ...

  5. 剑指offer--11.数组中出现次数超过一半的数字

    unique(), count()函数好用 ---------------------------------------------------------------------- 时间限制:1秒 ...

  6. 剑指Offer-28.数组中出现次数超过一半的数字(C++/Java)

    题目: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2.如 ...

  7. 1-剑指offer: 数组中出现次数超过一半的数字

    题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. ...

  8. 剑指offer-数组中出现次数超过一半的数字

    题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. ...

  9. 【剑指Offer】数组中出现次数超过一半的数字 解题报告(Python)

    [剑指Offer]数组中出现次数超过一半的数字 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-inter ...

随机推荐

  1. Vue.js-----轻量高效的MVVM框架(四、指令)

    Vue指令 指令 (Directives) 是特殊的带有前缀 v- 的特性.指令的值限定为绑定表达式,因此上面提到的 JavaScript 表达式及过滤器规则在这里也适用.指令的职责就是当其表达式的值 ...

  2. component: resolve => require(['../pages/home.vue'], resolve)

    component: resolve => require(['../pages/home.vue'], resolve) vue 路由的懒加载 import Vue from 'vue' im ...

  3. tomcat异常[1]--java.lang.ClassNotFoundException: XXXX.EncodingFilter

    EncodingFilter类在java项目中,确实存在,但是启动项目时,总是说找不到这个类. 后来想了一下,项目运行取的应该是项目WEB-INF/classes下面已经编译为.class文件的类文件 ...

  4. c语言字符函数

    函数名: stpcpy 功  能: 拷贝一个字符串到另一个 用  法: char *stpcpy(char *destin, char *source); 程序例: #include <stdi ...

  5. Ubuntu截图工具gnome-screenshot使用教程

    Ubuntu自带的截图工具非常好用,可以自已设置各种截图的快捷键,下面我们一起来了解一下这个截图工具gnome-screenshot   Ubuntu自带的截图工具非常好用,可以自已设置各种截图的快捷 ...

  6. [一点一滴.NET]进程和线程的区别

    进程是“执行中的程序”,是一个动态的概念.我们使用IDE编写的程序是静态的,静态程序经过编译形成EXE文件,运行起来之后就形成了一个进程.进程不仅仅是程序的代码,还包含了程序运行时的活动信息,通常由程 ...

  7. 案例49-crm练习获取客户列表带有分页和筛选功能

    1 案例分析 2 书写步骤 1.封装PageBean 2.书写Action 3.书写Service 4.书写Dao   注意清空之前设置的聚合函数  dc.setProjection(null); 5 ...

  8. redis数据类型及常用命令使用

    redis干啥的,一般人都知道,但很多人只知道是个缓存数据库,其它的就不知道了,本猿无能亦是如此,然知耻而后勇,我们该理一理这里边的一些逻辑,看看redis究竟是怎么一回事儿,能干啥,怎么做的,这样才 ...

  9. Thinkpad T460声音问题

    ThinkPad T460,安装Windows 7 64位后,下载官网驱动各项正常,但声音在刚启动时正常,很快就变成无声状态,重新启动又会正常,如此反复,重新安装驱动依然存在. 后来在设备管理器中发现 ...

  10. EFCodeFirst 数据迁移问题~

    问题描述:将项目从TFS载下来  然后敲update-database 进行数据迁移 提示:Update-Database : 无法将“Update-Database”项识别为 cmdlet.函数.脚 ...