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 18 Python
python中关于时间和日期函数的常用计算总结(time和datatime)
Mar 08 Python
Python自动化运维_文件内容差异对比分析
Dec 13 Python
pandas数据预处理之dataframe的groupby操作方法
Apr 13 Python
在linux下实现 python 监控usb设备信号
Jul 03 Python
Django对数据库进行添加与更新的例子
Jul 12 Python
Python学习笔记之Django创建第一个数据库模型的方法
Aug 07 Python
用python3 urllib破解有道翻译反爬虫机制详解
Aug 14 Python
把vgg-face.mat权重迁移到pytorch模型示例
Dec 27 Python
基于Tensorflow读取MNIST数据集时网络超时的解决方式
Jun 22 Python
python中最小二乘法详细讲解
Feb 19 Python
Python+Appium自动化测试的实战
Jun 30 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 Rename 更改文件、文件夹名称
2011/05/24 PHP
php根据年月获取季度的方法
2014/03/31 PHP
php查看网页源代码的方法
2015/03/13 PHP
jquery获取多个checkbox的值异步提交给php的方法
2015/06/24 PHP
举例详解PHP脚本的测试方法
2015/08/05 PHP
javascript支持firefox,ie7页面布局拖拽效果代码
2007/12/20 Javascript
Javascript typeof 用法
2008/12/28 Javascript
JS实现的N多简单无缝滚动代码(包含图文效果)
2015/11/06 Javascript
简单实现JS对dom操作封装
2015/12/02 Javascript
Angularjs使用ng-repeat中$even和$odd属性的注意事项
2016/12/31 Javascript
详解10分钟学会vue滚动行为
2017/09/21 Javascript
Angular2 父子组件通信方式的示例
2018/01/29 Javascript
Vue中使用方法、计算属性或观察者的方法实例详解
2018/10/31 Javascript
如何手动实现es5中的bind方法详解
2018/12/07 Javascript
如何在Vue.js中实现标签页组件详解
2019/01/02 Javascript
Webpack中SplitChunksPlugin 配置参数详解
2020/03/24 Javascript
国内常用的js类库大全(CDN公共库)
2020/06/24 Javascript
Python中使用logging模块代替print(logging简明指南)
2014/07/09 Python
python判断字符串是否包含子字符串的方法
2015/03/24 Python
python实现网站的模拟登录
2016/01/04 Python
实例讲解Python中函数的调用与定义
2016/03/14 Python
python微信跳一跳系列之棋子定位像素遍历
2018/02/26 Python
从列表或字典创建Pandas的DataFrame对象的方法
2019/07/06 Python
对Python3中列表乘以某一个数的示例详解
2019/07/20 Python
Python 自由定制表格的实现示例
2020/03/20 Python
Python实现CAN报文转换工具教程
2020/05/05 Python
Python做图像处理及视频音频文件分离和合成功能
2020/11/24 Python
纯DOM+CSS3实现简单的小风车动画
2016/09/27 HTML / CSS
DKNY品牌官网:纽约大都会时尚风格
2016/10/20 全球购物
描述RIP和OSPF区别以及特点
2015/01/17 面试题
大学生四个方面的自我评价
2013/09/19 职场文书
桥梁与隧道工程专业本科生求职信
2013/10/08 职场文书
优秀小学生家长评语
2014/01/30 职场文书
表彰会主持词
2014/03/26 职场文书
小学感恩教育活动总结
2014/07/07 职场文书
HTML+VUE分页实现炫酷物联网大屏功能
2021/05/27 Vue.js