剑指offer(第二版)读书笔记以及编程题目python版答案(一)

本文是《剑指offer(第二版)》的读书笔记,包括四个编程题目:找出数组中重复的数字、不修改数组找出重复数字、二维数组中的查找以及替换空格。提供了GitHub代码链接及解题思路,涉及排序、哈希表、二分查找等算法。
摘要由CSDN通过智能技术生成

github地址:https://github.com/ciecus/leetcode_answers/tree/master/jianzhi_offer

题目一:找出数组中重复的数字

书P39

github代码名称:t1_duplicated_numbers.py

在一个长度为n的数组里的所有数字都在0~n-1的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字2或者3.

解题思路

思路一:先排序,排序的时间复杂度为O(nlogn),然后从头到尾扫描 思路二:利用哈希表,字典结构,时间复杂度O(n),空间复杂度O(n) 思路三【比较复杂】:数组中的数字都在0~n-1的范围内。如果这个数字中没有重复的数字,排序之后数字i将出现在下标为i的位置。 所以可以从头到尾扫描这个数组的每个数字,当扫描到下标为i的数字时,首先比较这个数字是不是等于i,如果不是就拿它和第m个数字进行比较。如果它和m个数字相等就找到了一个重复数字。如果和第m个数字不想等,就和第m个数字交换。【太复杂了,暂缓】

测试用例

(1)长度为n的数组里包含一个或者多个重复的数字。

(2)数组中不包含重复的数字

(3)无效测试用例(输入空指针:长度为n的数组中包含0~n-1之外的数字)

==输入格式 == 数组长度n 输入数组 长度为n的列表 例如: 3 1 2 2

代码

方法一:

import sys

def duplicated_number_1(n,values):
    if (len(values) != n) |(len(values)==0):
        print('the wrong input')
    else:
        values.sort()
        dup_list = []
        for i in range(n-1):
            if values[i] == values[i+1]:
                dup_list.append(values[i])
        dup_list = set(dup_list)
        if len(dup_list)>0:
            string = ''
            for dup in dup_list:
                string +=
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值