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编程实现12306的一个小爬虫实例
Dec 27 Python
python logging日志模块以及多进程日志详解
Apr 18 Python
python爬虫_实现校园网自动重连脚本的教程
Apr 22 Python
PyGame贪吃蛇的实现代码示例
Nov 21 Python
Pycharm+Scrapy安装并且初始化项目的方法
Jan 15 Python
python命令行参数用法实例分析
Jun 25 Python
python多线程扫描端口(线程池)
Sep 04 Python
python turtle 绘制太极图的实例
Dec 18 Python
Python urlopen()和urlretrieve()用法解析
Jan 07 Python
SpringBoot实现登录注册常见问题解决方案
Mar 04 Python
Python基于pyecharts实现关联图绘制
Mar 27 Python
Python利用imshow制作自定义渐变填充柱状图(colorbar)
Dec 10 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跳转页面的几种实现方法详解
2013/06/08 PHP
解析php dirname()与__FILE__常量的应用
2013/06/24 PHP
php+ajax实现无刷新分页的方法
2014/11/04 PHP
PHP中addslashes()和stripslashes()实现字符串转义和还原用法实例
2016/01/07 PHP
[原创]php简单隔行变色功能实现代码
2016/07/09 PHP
完美的php分页类
2017/10/24 PHP
php 策略模式原理与应用深入理解
2019/09/25 PHP
php ZipArchive实现多文件打包下载实例
2019/10/31 PHP
jquery validate.js表单验证的基本用法入门
2010/05/13 Javascript
httpclient模拟登陆具体实现(使用js设置cookie)
2013/12/11 Javascript
javascript 获取网页标题代码实例
2014/01/22 Javascript
js实现模拟计算器退格键删除文字效果的方法
2015/05/07 Javascript
jQuery实现网页抖动的菜单抖动效果
2015/08/07 Javascript
原生js实现无限循环轮播图效果
2017/01/20 Javascript
Omi v1.0.2发布正式支持传递javascript表达式
2017/03/21 Javascript
Ajax验证用户名或昵称是否已被注册
2017/04/05 Javascript
详谈js原型继承的一些问题
2017/09/06 Javascript
Nginx 配置多站点vhost 的方法
2018/01/07 Javascript
微信小程序block的使用教程
2018/04/01 Javascript
Vue表单demo v-model双向绑定问题
2018/06/29 Javascript
微信小程序实现手指触摸画板
2018/07/09 Javascript
vue实现搜索过滤效果
2019/05/28 Javascript
浅谈element中InfiniteScroll按需引入的一点注意事项
2020/06/05 Javascript
浅析Python中将单词首字母大写的capitalize()方法
2015/05/18 Python
Python利用带权重随机数解决抽奖和游戏爆装备问题
2016/06/16 Python
Python处理Excel文件实例代码
2017/06/20 Python
使用pickle存储数据dump 和 load实例讲解
2019/12/30 Python
米兰网婚纱礼服法国网上商店:Milanoo法国
2016/08/20 全球购物
探索欧洲最好的品牌:Bombinate
2019/06/14 全球购物
Linux文件操作命令都有哪些
2016/07/23 面试题
为什么需要版本控制
2016/10/28 面试题
保护环境倡议书500字
2014/05/19 职场文书
化学专业大学生职业生涯规划范文
2014/09/13 职场文书
单位介绍信格式
2015/01/31 职场文书
django如何自定义manage.py管理命令
2021/04/27 Python
SpringBoot连接MySQL获取数据写后端接口的操作方法
2021/11/02 MySQL