一起来刷《剑指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的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组中任意一个重复的数字.例如 ...
随机推荐
- WebSocket与即时通讯
HTTP 协议有一个缺陷:通信只能由客户端发起!HTTP 协议做不到服务器主动向客户端推送信息.这种单向请求的特点,注定了如果服务器有连续的状态变化,客户端要获知就非常麻烦.我们只能使用"轮 ...
- vue Element-ui el-menu 左侧导航条
<template> <!--实现左侧导航条动态渲染(三级)--> <el-menu class="el-menu-vertical-demo" @o ...
- Solon 框架详解(十)- Solon 的常用配置
Springboot min -Solon 详解系列文章: Springboot mini - Solon详解(一)- 快速入门 Springboot mini - Solon详解(二)- Solon ...
- polay计数原理
公式: Burnside引理: 1/|G|*(C(π1)+C(π2)+C(π3)+.....+C(πn)): C(π):指不同置换下的等价类数.例如π=(123)(3)(45)(6)(7),X={1, ...
- Forms身份验证 知识总结
最简单的Forms验证实现方法:FormsAuthentication.SetAuthCookie()方法,传递一个登录名即可FormsAuthentication.SignOut()方法退出Form ...
- 「免费开源」基于Vue和Quasar的前端SPA项目crudapi后台管理系统实战之自定义组件(四)
基于Vue和Quasar的前端SPA项目实战之序列号(四) 回顾 通过上一篇文章 基于Vue和Quasar的前端SPA项目实战之布局菜单(三)的介绍,我们已经完成了布局菜单,本文主要介绍序列号功能的实 ...
- Redis实战篇(四)基于GEO实现查找附近的人功能
如果现在要开发一个功能: 要为一款交友App实现查找附近的人,并按距离进行排序. 让你来开发这个功能,你会如何实现? MySQL 不合适 你可能想到,把用户用户的经纬度坐标使用MySQL等关系数据库( ...
- SpringBoot-11 扩展功能
SpringBoot-11 扩展功能 异步 同步就是一个任务的完成需要依赖另外一个任务时,只有等待被依赖的任务完成后,依赖的任务才能算完成,这是一种可靠的任务序列.要么成功都成功,失败都失败,两个任务 ...
- kubernetes dashboard 2.0 部署
dashboard 可以从微软中国提供的 gcr.io :http://mirror.azure.cn/help/gcr-proxy-cache.html免费代理下载被墙的镜像 docker pull ...
- 学习笔记-vue.js获取file文件数据
在vue中file不能像其他input一样使用 v-model 双向数据绑定,因为文件选择是只读,只能用onchange监控值得变化. 所有需要使用v-on:change去监控. 例1: <in ...