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字符串连接方法分析
Apr 12 Python
Python脚本处理空格的方法
Aug 08 Python
Python正则表达式匹配中文用法示例
Jan 17 Python
Django查询数据库的性能优化示例代码
Sep 24 Python
将字典转换为DataFrame并进行频次统计的方法
Apr 08 Python
python机器学习之KNN分类算法
Aug 29 Python
把JSON数据格式转换为Python的类对象方法详解(两种方法)
Jun 04 Python
详解pandas删除缺失数据(pd.dropna()方法)
Jun 25 Python
Python 实现数组相减示例
Dec 27 Python
使用keras实现孪生网络中的权值共享教程
Jun 11 Python
浅谈pytorch中torch.max和F.softmax函数的维度解释
Jun 28 Python
OpenCV实现常见的四种图像几何变换
Apr 01 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中利用XML技术构造远程服务(上)
2006/10/09 PHP
PHP set_time_limit(0)长连接的实现分析
2010/03/02 PHP
php数组函数序列之array_search()- 按元素值返回键名
2011/11/04 PHP
PHP获取音频文件的相关信息
2015/06/22 PHP
Laravel框架使用Seeder实现自动填充数据功能
2018/06/13 PHP
PHP session垃圾回收机制实例分析
2019/06/28 PHP
深入认识JavaScript中的函数
2007/01/22 Javascript
简单三步,搞掂内存泄漏
2007/03/10 Javascript
用dom+xhtml+css制作的一个相册效果代码打包下载
2008/01/24 Javascript
createElement动态创建HTML对象脚本代码
2008/11/24 Javascript
php gethostbyname获取域名ip地址函数详解
2010/01/24 Javascript
js实现带搜索功能的下拉框实时搜索实时匹配
2013/11/05 Javascript
JavaScript判断是否为数组的3种方法及效率比较
2015/04/01 Javascript
常用的Javascript设计模式小结
2015/12/09 Javascript
jQuery回到顶部的代码
2016/07/09 Javascript
JS制作类似选项卡切换的年历
2016/12/03 Javascript
Bootstrap3 内联单选和多选框
2016/12/29 Javascript
利用js查找数组中指定元素并返回该元素的所有索引示例
2017/03/29 Javascript
vue checkbox 全选 数据的绑定及获取和计算方法
2018/02/09 Javascript
babel之配置文件.babelrc入门详解
2018/02/22 Javascript
vue 解除鼠标的监听事件的方法
2019/11/13 Javascript
重置Redux的状态数据的方法实现
2019/11/18 Javascript
jquery实现简单拖拽效果
2020/07/20 jQuery
[14:57]DOTA2 HEROS教学视频教你分分钟做大人-幽鬼
2014/06/13 DOTA
Python translator使用实例
2008/09/06 Python
用Python识别人脸,人种等各种信息
2019/07/15 Python
python模拟键盘输入 切换键盘布局过程解析
2019/08/15 Python
python3.x 生成3维随机数组实例
2019/11/28 Python
俄罗斯女装店:12storeez
2019/10/25 全球购物
俄罗斯在线大型超市:ТутПросто
2021/01/08 全球购物
环境科学专业个人求职的自我评价
2013/11/28 职场文书
CAD制图设计师自荐信
2014/01/29 职场文书
《伯牙绝弦》教学反思
2014/03/02 职场文书
财务管理专业求职信
2014/06/11 职场文书
标准大学生职业生涯规划书写作指南
2014/09/18 职场文书
先进个人主要事迹范文
2015/11/04 职场文书