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实现的二维码生成小软件
Jul 11 Python
python计算N天之后日期的方法
Mar 31 Python
使用Python的Twisted框架实现一个简单的服务器
Apr 16 Python
在Python的Django框架中生成CSV文件的方法
Jul 22 Python
python-opencv在有噪音的情况下提取图像的轮廓实例
Aug 30 Python
Python 找到列表中满足某些条件的元素方法
Jun 26 Python
使用Python读取二进制文件的实例讲解
Jul 09 Python
python多进程下实现日志记录按时间分割
Jul 22 Python
Python通过递归获取目录下指定文件代码实例
Nov 07 Python
Python autoescape标签用法解析
Jan 17 Python
Django实现翻页的示例代码
May 24 Python
图神经网络GNN算法
May 11 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的超级变量$_POST获取HTML表单(HTML Form) 数据
2011/05/07 PHP
在windows服务器开启php的gd库phpinfo中未发现
2013/01/13 PHP
服务器变量 $_SERVER 的深入解析
2013/07/02 PHP
ThinkPHP 整合Bootstrap Ajax分页样式
2016/12/23 PHP
Laravel 微信小程序后端实现用户登录的示例代码
2019/11/26 PHP
javascript中Math.random()使用详解
2015/04/15 Javascript
每天一篇javascript学习小结(属性定义方法)
2015/11/19 Javascript
浅析javascript函数表达式
2016/02/10 Javascript
jQuery EasyUI常用数据验证汇总
2016/09/18 Javascript
AngularJS通过$location获取及改变当前页面的URL
2016/09/23 Javascript
深入理解JavaScript定时机制
2016/10/27 Javascript
JS如何设置iOS中微信浏览器的title
2016/11/22 Javascript
vue 请求后台数据的实例代码
2017/06/22 Javascript
详解Node中导入模块require和import的区别
2017/08/11 Javascript
简单谈谈关于Angular Cli打包的事
2017/09/05 Javascript
C#实现将一个字符转换为整数
2017/12/12 Javascript
vue组件(全局,局部,动态加载组件)
2018/09/02 Javascript
Element ui 下拉多选时新增一个选择所有的选项
2019/08/21 Javascript
原生js实现五子棋游戏
2020/05/28 Javascript
element-ui封装一个Table模板组件的示例
2021/01/04 Javascript
使用Python编写简单的画图板程序的示例教程
2015/12/08 Python
Python实现学校管理系统
2018/01/11 Python
python xpath获取页面注释的方法
2019/01/14 Python
简单了解python数组的基本操作
2019/11/26 Python
Pycharm 2020年最新激活码(亲测有效)
2020/09/18 Python
基于CSS3 animation动画属性实现轮播图效果
2017/09/12 HTML / CSS
我的珠宝盒:Ma boîte à bijoux
2019/08/27 全球购物
乌鸦喝水教学反思
2014/02/07 职场文书
有关九一八事变的演讲稿
2014/09/14 职场文书
2014四风问题对照检查材料范文
2014/09/15 职场文书
2014年食堂工作总结
2014/11/20 职场文书
2014年个人工作总结模板
2014/12/15 职场文书
员工评语范文
2014/12/31 职场文书
2015教师年度思想工作总结
2015/04/30 职场文书
再次探讨go实现无限 buffer 的 channel方法
2021/06/13 Golang
javascript进阶篇深拷贝实现的四种方式
2022/07/07 Javascript