一起来刷《剑指Offer》-- 题目一:找出数组中重复的数字(Python多种方法实现)
数组中重复的数字
最近在复习算法和数据结构(基于Python实现),然后看了Python的各种“序列”——比如列表List、元组Tuple和字符串String,后期会写一篇博客介绍 数组
这一数据结构。
不过我们先来看《剑指Offer》中关于数组的一道面试题。
面试题3:数组中重复的数字
题目一:找出数组中重复的数字
给定一个长度为 n 的数组里的所有数字都在 0∼n−1 的范围内。
数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。
请找出数组中任意一个重复的数字。
样例:
给定 nums = [2, 3, 1, 0, 2, 5, 3]
返回 2 或 3
思路
首先我们得明白,题目要求是 返回任意一个重复的数字
。并没有限定其他条件(时间复杂度和空间复杂度多少),所以解题思路有很多,我们着重看下面这几中解法:
- 排序后查找:简单的方法就是先把输入的数组排序,排好序的数组,直接比较相邻的两个数就好,如果存在相邻的数组相等,返回这个数。
- 利用哈希表:从头到尾按顺序扫描数组的每个数字,每扫到一个数字的时候,如果还没有这个数字,就把它加入哈希表。如果哈希表表中已经存在了该数字,就找到了一个重复的数字。
- 时间换空间:我们观察到,利用哈希表的方法是增加了 $ o(n)$ 大小的哈希表为代价,看能不能找到$ o(1) $的算法。
以下代码都是用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 -- 两数之和解法思路很像,都是对数组中知识的考察。有兴趣的同学可以去做做那道题,代码实现上也很一致。
一起来刷《剑指Offer》-- 题目一:找出数组中重复的数字(Python多种方法实现)的更多相关文章
- 剑指offer:1.找出数组中重复的数(java版)
数组中重复的数:题目:找出数组中重复的数,题目描述:在一个长度为n的数组里的所有数字都在0到n-1的范围内.数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任 ...
- 剑指Offer(书):数组中重复的数字
题目:找出数组中重复的数字. 说明:在一个长度为n的数组里的所有数字都在0~n-1的范围内,数组中某些数字是重复的,但是不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组中任意一个重复的数 ...
- 【剑指Offer】面试题03. 数组中重复的数字
题目 找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组中任意 ...
- 剑指offer 面试题3:数组中重复的数字
题目描述 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果输入长度为 ...
- (python)剑指Offer 面试题51:数组中重复的数字
问题描述 在长度为n的数组中,所有的元素都是0到n-1的范围内. 数组中的某些数字是重复的,但不知道有几个重复的数字,也不知道重复了几次,请找出任意重复的数字. 例如,输入长度为7的数组{2,3,1, ...
- 《剑指offer》面试题03. 数组中重复的数字
问题描述 找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组中 ...
- 【Java】 剑指offer(1) 找出数组中重复的数字
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 在一个长度为n的数组里的所有数字都在0到n-1的范围内.数组中某些数字 ...
- 《剑指offer》第三_一题(找出数组中重复的数字,可改变数组)
// 面试题3(一):找出数组中重复的数字 // 题目:在一个长度为n的数组里的所有数字都在0到n-1的范围内.数组中某些数字是重复的,但不知道有几个数字重复了, // 也不知道每个数字重复了几次.请 ...
- 剑指offer笔记面试题3----数组中重复的数字
题目一:找出数组中重复的数字.在一个长度为n的数组里的所有数字都在0~n-1的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组中任意一个重复的数字.例如 ...
随机推荐
- MySQL全面瓦解24:构建高性能索引(策略篇)
学习如果构建高性能的索引之前,我们先来了解下之前的知识,以下两篇是基础原理,了解之后,对面后续索引构建的原则和优化方法会有更清晰的理解: MySQL全面瓦解22:索引的介绍和原理分析 MySQL全面瓦 ...
- Springboot的监控
目录 Micrometer 计数器 仪表 摘要 计时器 Prometheus grafana 保存后我们就能在dashboard上看得我我们的监控指标了参考 Spring Boot有个子项目Sprin ...
- 60秒定位问题,十倍程序员的Debug日常
作者:陶建辉 这是我在 2020 年 5 月写的一篇内部博客,当时是希望研发和技术支持同学能够帮助用户快速定位 Bug,解决问题.2020 年 12 月我又迭代了一版,并还针对此进行了内部的培训.这段 ...
- python课程设计--学生管理系统
系统要求 1.添加学生 2.删除学生 3.修改学生信息 4.查询学生 5.查看所有学生信息 6.学生信息数据的存储与读取 源码:student.py #coding:utf-8 2 #定义学员类 3 ...
- 《C++反汇编与逆向分析技术揭秘》--认识启动函数,找到用户入口
<C++反汇编与逆向分析>和<程序员的自我修养>都是以VC6的代码作为例子讲解的.这里是在vs2017下,CRT代码有些区别,但整体流程上都是初始化环境,设置参数,最后转到用户 ...
- 【linux】系统编程-8-Socket
目录 前言 11. 套接字 11.1 Socket简介 11.2 socket() 11.3 bind() 11.4 connect() 11.5 listen() 11.6 accept() 11. ...
- Java自定义 sort 排序方法
Sort用法 •结构 1 package Test; 2 3 import java.util.Arrays; 4 import java.util.Random; 5 import java.uti ...
- 亲自动手实现Python+pygame中国象棋游戏
功能1:实现游戏整体界面显示 一.创建基本的结构 代码如下: import time import pygame def main(): # 初始化pygame pygame.init() # 创建用 ...
- java学习(更新中)
class Test { public static void main(String[] args) { System.out.println("Hello World!"); ...
- Database | 浅谈Query Optimization (1)
综述 由于SQL是声明式语言(declarative),用户只告诉了DBMS想要获取什么,但没有指出如何计算.因此,DBMS需要将SQL语句转换成可执行的查询计划(Query Plan).但是对同样的 ...