《剑指Offer》-- 题目一:找出数组中重复的数字(Python多种方法实现)
时间:2022-07-28
本文章向大家介绍《剑指Offer》-- 题目一:找出数组中重复的数字(Python多种方法实现),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
数组中重复的数字
最近在复习算法和数据结构(基于Python实现),然后看了Python的各种“序列”——比如列表List、元组Tuple和字符串String,后期会写一篇博客介绍 数组
这一数据结构。
不过我们先来看《剑指Offer》中关于数组的一道面试题。
面试题3:数组中重复的数字
题目一:找出数组中重复的数字 给定一个长度为 n 的数组里的所有数字都在 0∼n−1 的范围内。 数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。 请找出数组中任意一个重复的数字。 样例: 给定 nums = [2, 3, 1, 0, 2, 5, 3] 返回 2 或 3
思路
首先我们得明白,题目要求是 返回任意一个重复的数字
。并没有限定其他条件(时间复杂度和空间复杂度多少),所以解题思路有很多,我们着重看下面这几中解法:
- 排序后查找:简单的方法就是先把输入的数组排序,排好序的数组,直接比较相邻的两个数就好,如果存在相邻的数组相等,返回这个数。
- 利用哈希表:从头到尾按顺序扫描数组的每个数字,每扫到一个数字的时候,如果还没有这个数字,就把它加入哈希表。如果哈希表表中已经存在了该数字,就找到了一个重复的数字。
- 时间换空间:我们观察到,利用哈希表的方法是增加了
大小的哈希表为代价,看能不能找到
的算法。
以下代码都是用Python实现
排序后查找
def find_double_num(nums):
"""思路一:把输入的数组排序,从排序数组中找出重复的数字
"""
nums_sorted = sorted(nums)
length = len(nums_sorted)
for i in range(1, length):
if nums_sorted[i] == nums_sorted[i - 1]:
print("重复数字: ", nums_sorted[i])
return True
return False
利用哈希表
def find_double_num2(nums):
"""思路二:哈希表,从头到尾顺序扫描数组中的每个数字,
哈希表中没有这个数字就加入哈希表。如果哈希表中存在就找到了一个重复的数字"""
hash_map = dict()
for i, val in enumerate(nums):
if val in hash_map:
print("重复数字: ", val)
return True
hash_map[val] = i
return False
时间换空间的方法
def find_double_num3(nums):
if nums is None and len(nums) <= 0:
return False
for i in range(len(nums)):
while i != nums[i]:
if nums[i] == nums[nums[i]]:
print("重复数字: ", nums[i])
return True
else:
tmp = nums[i]
nums[i] = nums[tmp]
nums[tmp] = tmp
return False
测试
nums_test = [2, 3, 1, 0, 2, 5, 3]
print(find_double_num(nums_test))
print(find_double_num2(nums_test))
print(find_double_num3(nums_test))
输出结果
重复数字: 2
True
重复数字: 2
True
重复数字: 2
True
总结
其实,刚看到书的这道题,我就觉得很眼熟。仔细想想,这道题跟LeetCode 01 -- 两数之和解法思路很像,都是对数组中知识的考察。有兴趣的同学可以去做做那道题,代码实现上也很一致。
- linux学习第三十六篇:MariaDB安装,Apache安装
- Python 5种连接字符串的方法
- Python 装饰器(Decorator)
- linux学习第三十七篇:安装PHP5,安装PHP7
- linux学习第三十八篇: Apache和PHP结合,Apache默认虚拟主机
- Python lambda表达式
- Python的闭包(Closure)与惰性计算(Lazy Evaluation)
- linux学习第三十九篇:Apache用户认证,域名跳转,Apache访问日志
- Python sorted()函数
- Python filter()函数
- Python reduce()函数
- Python map()函数
- Python iterator迭代器
- How To Implement The Decision Tree Algorithm From Scratch In Python (从零开始在Python中实现决策树算法)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 详解 Linux中的关机和重启命令
- 数据分析入门系列教程-KNN原理
- Selenium自动化的JUnit参数化实践
- linux云主机安装pdo详细教程
- Linux常用命令last的使用方法详解
- Linux命令搜索命令whereis与which的区别
- centos6.5服务器安装Nginx设置服务和开机自启的方法
- linux系统挂载数据盘的方法(视频图文教程)
- CentOS7 Docker Nginx部署及运行详解
- linux下安装memcached_动力节点Java学院整理
- OneinStack一键安装PHP/JAVA/HHVM和超详细的VPS手动安装LNMP的方法
- RTSP协议视频平台EasyNVR如何将静态广告位修改为动态广告位?
- keeplive+mysql+drbd高可用架构安装步骤
- IP摄像头RTSP协议视频平台EasyNVR录像列表没有按照开始时间倒序排序的问题修复
- leetcode哈希表之两数之和