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栈算法的实现与简单应用示例
Nov 01 Python
Python实现的NN神经网络算法完整示例
Jun 19 Python
Python 实现两个列表里元素对应相乘的方法
Nov 14 Python
对pandas中时间窗函数rolling的使用详解
Nov 28 Python
举例讲解Python常用模块
Mar 08 Python
python ChainMap 合并字典的实现步骤
Jun 11 Python
对Django url的几种使用方式详解
Aug 06 Python
关于Python形参打包与解包小技巧分享
Aug 24 Python
基于python3生成标签云代码解析
Feb 18 Python
python的列表List求均值和中位数实例
Mar 03 Python
Python类和实例的属性机制原理详解
Mar 21 Python
解决Python在导入文件时的FileNotFoundError问题
Apr 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中路径问题的解决方案
2006/10/09 PHP
PHP按行读取、处理较大CSV文件的代码实例
2014/04/09 PHP
destoon实现资讯信息前面调用它所属分类的方法
2014/07/15 PHP
详解PHP的Yii框架中自带的前端资源包的使用
2016/03/31 PHP
tp5.1 框架数据库-数据集操作实例分析
2020/05/26 PHP
基于PHP实现短信验证码发送次数限制
2020/07/11 PHP
JQuery实现的图文自动轮播效果插件
2015/06/19 Javascript
jQuery实现宽屏图片轮播实例教程
2015/11/24 Javascript
实例讲解js验证表单项是否为空的方法
2016/01/09 Javascript
很不错的两款Bootstrap Icon图标选择组件
2016/01/28 Javascript
JavaScript function函数种类详解
2016/02/22 Javascript
js解决movebox移动问题
2016/03/29 Javascript
JS实现星星评分功能实例代码(两种方法)
2016/06/09 Javascript
教你如何在Node.js中使用jQuery
2016/08/28 Javascript
js 实现获取name 相同的页面元素并循环遍历的方法
2017/02/14 Javascript
JS与jQuery实现子窗口获取父窗口元素值的方法
2017/04/17 jQuery
js使用html2canvas实现屏幕截取的示例代码
2017/08/28 Javascript
[15:15]教你分分钟做大人:狙击手
2014/10/30 DOTA
python使用urllib模块和pyquery实现阿里巴巴排名查询
2014/01/16 Python
python中文乱码不着急,先看懂字节和字符
2017/12/20 Python
Python学习小技巧总结
2018/06/10 Python
python flask实现分页的示例代码
2018/08/02 Python
python实现计数排序与桶排序实例代码
2019/03/28 Python
Python程序打包工具py2exe和PyInstaller详解
2019/06/28 Python
基于python实现删除指定文件类型
2020/07/21 Python
HTML5 input新增type属性color颜色拾取器的实例代码
2018/08/27 HTML / CSS
Mavi牛仔裤美国官网:土耳其著名牛仔品牌
2016/09/24 全球购物
美赞臣营养马来西亚旗舰店:Enfagrow马来西亚
2019/07/26 全球购物
霸王洗发水广告词
2014/03/14 职场文书
学校庆元旦歌咏比赛主持词
2014/03/18 职场文书
怎样写离婚协议书
2014/09/10 职场文书
教师工作能力自我评价
2015/03/04 职场文书
地道战观后感
2015/06/04 职场文书
订货会主持词
2015/07/01 职场文书
如何利用js在两个html窗口间通信
2021/04/27 Javascript
mysql 排序失效
2022/05/20 MySQL