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 相关文章推荐
TensorFlow实现AutoEncoder自编码器
Mar 09 Python
python安装模块如何通过setup.py安装(超简单)
May 05 Python
python实现点对点聊天程序
Jul 28 Python
Python实现按逗号分隔列表的方法
Oct 23 Python
详解django实现自定义manage命令的扩展
Aug 13 Python
使用python实现离散时间傅里叶变换的方法
Sep 02 Python
python爬取本站电子书信息并入库的实现代码
Jan 20 Python
Django 解决model 反向引用中的related_name问题
May 19 Python
如何解决安装python3.6.1失败
Jul 01 Python
python 图像插值 最近邻、双线性、双三次实例
Jul 05 Python
python eventlet绿化和patch原理
Nov 21 Python
python神经网络 tf.name_scope 和 tf.variable_scope 的区别
May 04 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(2)
2006/10/09 PHP
实现分十页分向前十页向后十页的处理
2006/10/09 PHP
php支持中文字符串分割的函数
2015/05/28 PHP
PHP实现统计所有字符在字符串中出现次数的方法
2017/10/17 PHP
JS location几个方法小姐
2008/07/09 Javascript
JavaScript delete 属性的使用
2009/10/08 Javascript
jQuery 三击事件实现代码
2013/09/11 Javascript
兼容FF和IE的动态table示例自写
2013/10/21 Javascript
jQuery异步上传文件插件ajaxFileUpload详细介绍
2015/05/19 Javascript
js正则表达式中exec用法实例
2015/07/23 Javascript
详解Bootstrap插件
2016/04/25 Javascript
BootStrap入门教程(二)之固定的内置样式
2016/09/19 Javascript
javascript replace()第二个参数为函数时的参数用法
2016/12/26 Javascript
Bootstrap超大屏幕的实现代码
2017/03/22 Javascript
详解vue + vuex + directives实现权限按钮的思路
2017/10/24 Javascript
快速解决vue-cli不能初始化webpack模板的问题
2018/03/20 Javascript
vue自定义tap指令及tap事件的实现
2018/09/18 Javascript
实例详解带参数的 npm script
2019/05/28 Javascript
vue如何使用外部特殊字体的操作
2020/07/30 Javascript
[02:05]2014DOTA2西雅图邀请赛 老队长全明星大猜想谁不服就按进显示器
2014/07/08 DOTA
python用字典统计单词或汉字词个数示例
2014/04/22 Python
浅析Python中的赋值和深浅拷贝
2017/08/15 Python
python3 批量获取对应端口服务的实例
2019/07/25 Python
django创建最简单HTML页面跳转方法
2019/08/16 Python
python实现指定ip端口扫描方式
2019/12/17 Python
python处理RSTP视频流过程解析
2020/01/11 Python
pytorch VGG11识别cifar10数据集(训练+预测单张输入图片操作)
2020/06/24 Python
Pycharm添加虚拟解释器报错问题解决方案
2020/10/13 Python
如何用Lucene索引数据库
2016/02/23 面试题
团代会主持词
2014/04/02 职场文书
保证书格式范文
2014/04/28 职场文书
人大代表选举标语
2014/10/07 职场文书
2016年第16个全民国防教育日宣传活动总结
2016/04/05 职场文书
关于企业的执行力标语大全
2020/01/06 职场文书
Netty结合Protobuf进行编解码的方法
2021/06/26 Java/Android
7个关于Python的经典基础案例
2021/11/07 Python