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编写脚本获取手机当前应用apk的信息
Jul 21 Python
python轻松实现代码编码格式转换
Mar 26 Python
python九九乘法表的实例
Sep 26 Python
基于Python Numpy的数组array和矩阵matrix详解
Apr 04 Python
python的dataframe和matrix的互换方法
Apr 11 Python
详解将Django部署到Centos7全攻略
Sep 26 Python
pygame游戏之旅 添加游戏界面按键图形
Nov 20 Python
Python不同目录间进行模块调用的实现方法
Jan 29 Python
Python实现爬取亚马逊数据并打印出Excel文件操作示例
May 16 Python
利用Python实现手机短信监控通知的方法
Jul 22 Python
Python高级编程之继承问题详解(super与mro)
Nov 19 Python
pytorch对梯度进行可视化进行梯度检查教程
Feb 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
火影忍者:这才是千手柱间和扉间的真正死因,角都就比较搞笑了!
2020/03/10 日漫
php顺序查找和二分查找示例
2014/03/27 PHP
PHP定义字符串的四种方式详解
2018/02/06 PHP
PHP序列化的四种实现方法与横向对比
2018/11/29 PHP
详解JavaScript的变量和数据类型
2015/11/27 Javascript
javascript中利用柯里化函数实现bind方法【推荐】
2016/04/29 Javascript
详解JavaScript中双等号引起的隐性类型转换
2016/05/30 Javascript
JS中用childNodes获取子元素换行会产生一个子元素
2016/12/08 Javascript
jquery实现数字输入框
2017/02/22 Javascript
JavaScript自定义文本框光标
2017/03/05 Javascript
对Vue beforeRouteEnter 的next执行时机详解
2018/08/25 Javascript
Vue cli构建及项目打包以及出现的问题解决
2018/08/27 Javascript
vue 详情跳转至列表页实现列表页缓存
2019/03/27 Javascript
[44:04]OG vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
python从ftp下载数据保存实例
2013/11/20 Python
Python实现的数据结构与算法之基本搜索详解
2015/04/22 Python
Python实现线程池代码分享
2015/06/21 Python
python登录豆瓣并发帖的方法
2015/07/08 Python
深入解析Python中的__builtins__内建对象
2016/06/21 Python
浅谈python字典多键值及重复键值的使用
2016/11/04 Python
Flask之flask-session的具体使用
2018/07/26 Python
python函数局部变量、全局变量、递归知识点总结
2019/11/15 Python
Python基础之字符串操作常用函数集合
2020/02/09 Python
树莓派4B安装Tensorflow的方法步骤
2020/07/16 Python
python利用paramiko实现交换机巡检的示例
2020/09/22 Python
实现CSS3中的border-radius(边框圆角)示例代码
2013/07/19 HTML / CSS
Gap英国官网:Gap UK
2018/07/18 全球购物
肯尼迪就职演说稿
2013/12/31 职场文书
家长给小学生的评语
2014/01/30 职场文书
硕士生工作推荐信
2014/03/07 职场文书
人事专员岗位说明书
2014/07/29 职场文书
本溪水洞导游词
2015/02/11 职场文书
物业客服专员岗位职责
2015/04/07 职场文书
免职通知
2015/04/23 职场文书
数据结构课程设计心得体会
2016/01/15 职场文书
python基础之//、/与%的区别详解
2022/06/10 Python