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 相关文章推荐
Pycharm学习教程(3) 代码运行调试
May 03 Python
Python测试人员需要掌握的知识
Feb 08 Python
python基础教程项目二之画幅好画
Apr 02 Python
Python自定义函数实现求两个数最大公约数、最小公倍数示例
May 21 Python
python selenium 获取标签的属性值、内容、状态方法
Jun 22 Python
python字符串Intern机制详解
Jul 01 Python
django中使用事务及接入支付宝支付功能
Sep 15 Python
python获取引用对象的个数方式
Dec 20 Python
logging level级别介绍
Feb 21 Python
python针对Oracle常见查询操作实例分析
Apr 30 Python
Python+OpenCV图像处理—— 色彩空间转换
Oct 22 Python
Spy++的使用方法及下载教程
Jan 29 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
根德Grundig S400/S500/S700电路分析
2021/03/02 无线电
PHP截取中文字符串的问题
2006/07/12 PHP
JavaScript 继承的实现
2009/07/09 Javascript
ext checkboxgroup 回填数据解决
2009/08/21 Javascript
基于Jquery的动态创建DOM元素的代码
2010/12/28 Javascript
functional继承模式 摘自javascript:the good parts
2011/06/20 Javascript
JS 跳转页面延迟2种方法
2013/03/29 Javascript
JavaScript基础教程之alert弹出提示框实例
2014/10/16 Javascript
移除AngularJS下URL中的#字符的方法
2015/06/19 Javascript
jquery插件pagination实现无刷新ajax分页
2015/09/30 Javascript
PassWord输入框代码分享
2016/06/07 Javascript
JavaScript中获取HTML元素值的三种方法
2016/06/20 Javascript
js设置和获取自定义属性的方法
2016/10/20 Javascript
JavaScript输入框字数实时统计更新
2017/06/17 Javascript
JS获取填报扩展单元格控件的值的解决办法
2017/07/14 Javascript
JS实现不用中间变量temp 实现两个变量值得交换方法
2018/02/04 Javascript
Cookbook组件形式:优化 Vue 组件的运行时性能
2018/11/25 Javascript
小程序自定义模板实现吸顶功能
2020/01/08 Javascript
[01:58]最残酷竞争 2016国际邀请赛中国区预选赛积分循环赛回顾
2016/06/28 DOTA
深入浅析ImageMagick命令执行漏洞
2016/10/11 Python
Python在不同目录下导入模块的实现方法
2017/10/27 Python
获取python文件扩展名和文件名方法
2018/02/02 Python
Python如何抓取天猫商品详细信息及交易记录
2018/02/23 Python
Python爬虫实现抓取京东店铺信息及下载图片功能示例
2018/08/07 Python
pyside+pyqt实现鼠标右键菜单功能
2020/12/08 Python
python对指定字符串逆序的6种方法(小结)
2020/04/02 Python
jupyter notebook tensorflow打印device信息实例
2020/04/20 Python
Django自关联实现多级联动查询实例
2020/05/19 Python
在pycharm创建scrapy项目的实现步骤
2020/12/01 Python
涉外经济法专业毕业生推荐信
2013/11/24 职场文书
《小动物过冬》教学反思
2014/04/17 职场文书
开展批评与自我批评发言材料
2014/10/17 职场文书
大学生党员个人总结
2015/02/13 职场文书
毕业证明模板
2015/06/19 职场文书
java中为什么说子类的构造方法默认访问的是父类的无参构造方法
2022/04/13 Java/Android
Python开发简易五子棋小游戏
2022/05/02 Python