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正则表达式match和search用法实例
Mar 26 Python
python实现下载指定网址所有图片的方法
Aug 08 Python
使用Python操作MySQL的一些基本方法
Aug 16 Python
Pycharm 操作Django Model的简单运用方法
May 23 Python
python实现计算器功能
Oct 31 Python
Django框架序列化与反序列化操作详解
Nov 01 Python
使用批处理脚本自动生成并上传NuGet包(操作方法)
Nov 19 Python
解决Python列表字符不区分大小写的问题
Dec 19 Python
django ORM之values和annotate使用详解
May 19 Python
详解基于Scrapy的IP代理池搭建
Sep 29 Python
完美解决Pycharm中matplotlib画图中文乱码问题
Jan 11 Python
python和Appium的移动端多设备自动化测试框架
Apr 26 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
德生PL330的评价与改造
2021/03/02 无线电
php 文章调用类代码
2011/08/11 PHP
PHP将DateTime对象转化为友好时间显示的实现代码
2011/09/20 PHP
php中数组首字符过滤功能代码
2012/07/31 PHP
PHP pthreads v3使用中的一些坑和注意点分析
2020/02/21 PHP
jqPlot Option配置对象详解
2009/07/25 Javascript
简洁短小的 JavaScript IE 浏览器判定代码
2010/03/21 Javascript
jquery动画1.加载指示器
2012/08/24 Javascript
解析Javascript中难以理解的11个问题
2013/12/09 Javascript
jquery动态添加option示例
2013/12/30 Javascript
Jquery使用小技巧汇总
2015/12/29 Javascript
jQuery简单实现列表隐藏和显示效果示例
2016/09/12 Javascript
easyui datebox 时间限制,datebox开始时间限制结束时间,datebox截止日期比起始日期大的实现代码
2017/01/12 Javascript
jQuery 添加样式属性的优先级别方法(推荐)
2017/06/08 jQuery
使用JS实现图片轮播的实例(前后首尾相接)
2017/09/21 Javascript
Angular angular-file-upload文件上传的示例代码
2018/08/23 Javascript
Vue组件实现触底判断
2019/06/26 Javascript
基于form-data请求格式详解
2019/10/29 Javascript
JS实现网页时钟特效
2020/03/25 Javascript
JS面向对象实现飞机大战
2020/08/26 Javascript
Vue + ts实现轮播插件的示例
2020/11/10 Javascript
Python中的rjust()方法使用详解
2015/05/19 Python
Django中使用group_by的方法
2015/05/26 Python
pycharm编写spark程序,导入pyspark包的3中实现方法
2019/08/02 Python
关于Python 常用获取元素 Driver 总结
2019/11/24 Python
Python数据存储之 h5py详解
2019/12/26 Python
python 爬取疫情数据的源码
2020/02/09 Python
python3 实现口罩抽签的功能
2020/03/11 Python
Python Opencv轮廓常用操作代码实例解析
2020/09/01 Python
英国著名的药妆网站:Escentual
2016/07/29 全球购物
英国最红的高街时尚品牌:Topshop
2016/08/05 全球购物
DC Shoes官网:美国滑板鞋和服饰品牌
2017/09/03 全球购物
机动车交通事故协议书
2015/01/29 职场文书
坎儿井导游词
2015/02/09 职场文书
幼儿园教研工作总结2015
2015/05/12 职场文书
pytorch 使用半精度模型部署的操作
2021/05/24 Python