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 相关文章推荐
django接入新浪微博OAuth的方法
Jun 29 Python
在Python中使用AOP实现Redis缓存示例
Jul 11 Python
分析Python中解析构建数据知识
Jan 20 Python
Python通过属性手段实现只允许调用一次的示例讲解
Apr 21 Python
Python连接Mssql基础教程之Python库pymssql
Sep 16 Python
Ubuntu下Python2与Python3的共存问题
Oct 31 Python
Python创建或生成列表的操作方法
Jun 19 Python
如何使用Python多线程测试并发漏洞
Dec 18 Python
python保存log日志,实现用log日志画图
Dec 24 Python
python实现简单坦克大战
Mar 27 Python
Django Admin后台模型列表页面如何添加自定义操作按钮
Nov 11 Python
pytorch 把图片数据转化成tensor的操作
Mar 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
Windows下部署Apache+PHP+MySQL运行环境实战
2012/08/31 PHP
IIS安装Apache伪静态插件的具体操作图文
2013/07/01 PHP
PHP保存session到memcache服务器的方法
2016/01/19 PHP
PHP二维数组去重实例分析
2016/11/18 PHP
PHP基于socket实现的简单客户端和服务端通讯功能示例
2017/07/10 PHP
VSCode+PHPstudy配置PHP开发环境的步骤详解
2020/08/20 PHP
prototype 中文参数乱码解决方案
2009/11/09 Javascript
基于jQuery实现的Ajax 验证用户名是否存在的实现代码
2011/04/06 Javascript
Javascript创建自定义对象 创建Object实例添加属性和方法
2012/06/04 Javascript
用jquery实现点击栏目背景色改变
2012/12/10 Javascript
JS禁用浏览器退格键实现思路及代码
2013/10/29 Javascript
通过正则表达式实现表单验证是否为中文
2014/02/18 Javascript
jquery遍历checkbox介绍
2014/02/21 Javascript
node.js下when.js 的异步编程实践
2014/12/03 Javascript
javascript显示中文日期的方法
2015/06/18 Javascript
webpack教程之webpack.config.js配置文件
2017/07/05 Javascript
vue鼠标悬停事件实例详解
2019/04/01 Javascript
jquery实现图片放大镜效果
2020/12/23 jQuery
[00:36]TI7不朽珍藏III——斯温不朽展示
2017/07/15 DOTA
浅谈python中scipy.misc.logsumexp函数的运用场景
2016/06/23 Python
python互斥锁、加锁、同步机制、异步通信知识总结
2018/02/11 Python
PyTorch中的padding(边缘填充)操作方式
2020/01/03 Python
python 中的命名空间,你真的了解吗?
2020/08/19 Python
记一次Django响应超慢的解决过程
2020/09/17 Python
css3 media 响应式布局的简单实例
2016/08/03 HTML / CSS
Mio Skincare美国官网:身体紧致及孕期身体护理
2017/03/05 全球购物
德国专业木制品经销商:Holz-Direkt24
2019/12/26 全球购物
2014年单位法制宣传日活动总结
2014/11/01 职场文书
网络营销计划
2015/01/17 职场文书
营销计划书
2015/01/17 职场文书
2015年世界无烟日活动总结
2015/02/10 职场文书
工厂清洁工岗位职责
2015/02/14 职场文书
新郎婚礼致辞
2015/07/27 职场文书
2016春季田径运动会广播稿
2015/12/21 职场文书
Python实现简单得递归下降Parser
2022/05/02 Python
pytest实现多进程与多线程运行超好用的插件
2022/07/15 Python