Python面试不修改数组找出重复的数字


Posted in Python onMay 20, 2022

数组中重复的数字

在上一篇博客中剑指Offer之面试题3: 数组中重复的数字中,其实能发现这类题目的关键就是一边遍历数组一边查满足条件的元素。

然后我们在博客​用最复杂的方式学会数组(Python实现动态数组)​这篇博客中介绍了数组这一结构的本质,并自己动手实现了一个动态数组。

今天我们介绍一下另一道来自《剑指Offer》的关于数组的面试题——不修改数组找出重复的数字。

不修改数组找出重复的数字

题目二:不修改数组找出重复的数字

给定一个长度为 n+1 的数组里的所有数字都在 0∼n 的范围内,所以数组中至少有一个数字是重复的。

请找出数组中任意一个重复的数字,但不能修改输入的数组。

样例:

给定长度为8的数组 nums = [2, 3, 5, 4,3, 2, 6,7]

那么输出重复的数字2或者3

思路

首先我们得关注到,题目要求是:不修改数组,然后还是 ​​ 返回任意一个重复的数字​​ 。所以解题思路相比而言变少了:

1.哈希表:跟上一题一样,本题也可以创建一个哈希表,如果原数组的每个数字第一次出现,就把他放到哈希表中去,即原数组大小为m的数字应该放到哈希表下标为m的位置上。空间复杂度是 $O(n)$ 。

2.二分法:那么有没有不用空间复杂度 $O(n)$ 的算法。假设没有重复数,那么​​1~n​​ 之间,每个数都只能出现一次。而题目中,这个数组至少有一个数字重复,即出现的次数大于1。

利用二分的思想:把 ​​1~n​​ 的数字从中间数字 m 开始分为两部分,前一半为 1~ m,后面一半为 ​​m+1 ~n​​​,如果 ​​1~m​​ 中的数字在数组中出现的次数大于 m,那么这一半必定有重复的数字;

否则,那么另一部分必定含有重复数字。接着我们,继续对含有重复数字的区间一分为二,直到找到重复的数字。

思路一:哈希表

def find_duplicated_num(nums):
    """hash_map"""
    hash_map = dict()
    for i, val in enumerate(nums):
        if val in hash_map:
            return val
        hash_map[val] = i
    return False

思路二:二分法

def reduce_inter(nums2, left, right):
    """ """
    mid = (left + right) // 2
    count = 0
    length = len(nums2)
    for i in range(length):
        if (nums2[i] >= left) and (nums2[i] <= mid):
            count += 1
    if count > mid - left + 1:
        return left, mid
    else:
        return mid+1, right


def find_duplicated_num2(nums2):
    left, right = 1, len(nums2) - 1
    while left != right:
        left, right = reduce_inter(nums2, left, right)
    return left

测试

nums = [2, 3, 5, 4, 3, 2, 6, 7]
# nums_n = [5, 4, 3, 2, 6, 7]
print("思路一测试结果: ", find_duplicated_num(nums))
print("思路二测试结果: ", find_duplicated_num2(nums))

结果

思路一测试结果:  3
思路二测试结果:  3

总结

其实,这种算法不能保证找出所有重复的数字,比如不能找出[2, 3, 5, 4, 3, 2, 6, 7]重复数字2。

以上就是不修改数组找出重复的数字Python实现的详细内容!


Tags in this post...

Python 相关文章推荐
python搭建简易服务器分析与实现
Dec 15 Python
python处理csv数据动态显示曲线实例代码
Jan 23 Python
Python 12306抢火车票脚本 Python京东抢手机脚本
Feb 06 Python
Python爬豆瓣电影实例
Feb 23 Python
小白如何入门Python? 制作一个网站为例
Mar 06 Python
python3使用SMTP发送HTML格式邮件
Jun 19 Python
python爬虫获取百度首页内容教学
Dec 23 Python
通过实例解析Python调用json模块
Dec 11 Python
对Tensorflow中Device实例的生成和管理详解
Feb 04 Python
Python虚拟环境venv用法详解
May 25 Python
matplotlib bar()实现多组数据并列柱状图通用简便创建方法
Feb 24 Python
Pytorch 如何加速Dataloader提升数据读取速度
May 28 Python
Python 中面向接口编程
May 20 #Python
人工智能深度学习OpenAI baselines的使用方法
May 20 #Python
baselines示例程序train_cartpole.py的ImportError
May 20 #Python
python通过新建环境安装tfx的问题
May 20 #Python
Python使用BeautifulSoup4修改网页内容
May 20 #Python
python标准库ElementTree处理xml
May 20 #Python
Python中使用tkFileDialog实现文件选择、保存和路径选择
May 20 #Python
You might like
详细介绍PHP应用提速面面观
2006/10/09 PHP
PHP array 的加法操作代码
2010/07/24 PHP
关于使用key/value数据库redis和TTSERVER的心得体会
2013/06/28 PHP
php学习笔记之面向对象
2014/11/08 PHP
php编程每天必学之验证码
2016/03/03 PHP
Laravel 模型关联基础教程详解
2019/09/17 PHP
限制复选框的最大可选数
2006/07/01 Javascript
JS对URL字符串进行编码/解码分析
2008/10/25 Javascript
js 解决“options为空或不是对象”
2008/12/22 Javascript
对xmlHttp对象的理解
2011/01/17 Javascript
jQuery输入城市查看地图使用介绍
2013/05/08 Javascript
jquery获取颜色在ie和ff下的区别示例介绍
2014/03/28 Javascript
js中函数调用的两种常用方法使用介绍
2014/07/17 Javascript
jQuery焦点图切换特效代码分享
2015/09/15 Javascript
一分钟理解js闭包
2016/05/04 Javascript
WEB前端开发框架Bootstrap3 VS Foundation5
2016/05/16 Javascript
JS实现将Asp.Net的DateTime Json类型转换为标准时间的方法
2016/08/02 Javascript
功能强大的Bootstrap效果展示(二)
2016/08/03 Javascript
jQuery中DOM节点的删除方法总结(超全面)
2017/01/22 Javascript
jquery select插件异步实时搜索实例代码
2017/10/20 jQuery
webpack vue项目开发环境局域网访问方法
2018/03/20 Javascript
用node撸一个监测复联4开售短信提醒的实现代码
2019/04/10 Javascript
Vue 通过公共字段,拼接两个对象数组的实例
2019/11/07 Javascript
DataFrame 将某列数据转为数组的方法
2018/04/13 Python
Python针对给定字符串求解所有子序列是否为回文序列的方法
2018/04/21 Python
Python爬虫设置代理IP(图文)
2018/12/23 Python
详解python多线程之间的同步(一)
2019/04/03 Python
python开发游戏的前期准备
2019/05/05 Python
python的pytest框架之命令行参数详解(上)
2019/06/27 Python
python2.7实现复制大量文件及文件夹资料
2019/08/31 Python
历史专业个人求职信分享
2013/12/20 职场文书
学习方法演讲稿
2014/05/10 职场文书
刑事上诉状范文
2015/05/22 职场文书
退伍军人感言
2015/08/01 职场文书
Java 在生活中的 10 大应用
2021/11/02 Java/Android
Win11任务栏太宽了怎么办?一招解决Win11任务栏太宽问题
2021/11/21 数码科技