剑指offer刷题记录(python3)

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

7.20

题目:请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。

解题思路:选择了最直接的一种方式:遍历

定义一个空列表 或 字符串,如果遍历的字符不是空格,直接存储,如果是空格,则存储“%20”

注意:如果定义的是列表(list),需要将list转成str,采用的是join()的方式,"".join(obj)表示直接拼接

知识点:str.join(sequence)

str可以是任何字符,sequence是个序列

# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
# @param s string字符串 
# @return string字符串
#
class Solution:
    def replaceSpace(self , s ):
        # wlrite code here
        l=[]
        t='%20'
        for i in range(len(s)):
            if s[i]!=' ':
                l.append(s[i])
            else:
                l.append(t)
        s="".join(l)
        return s

虽然通过了用例,但是这种解法效率不高

直接: return s.replace(' ','%20') 的效率写不高,等找到效率高的方式再补充吧,累了 

7.22

题目:在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任一一个重复的数字。 例如,如果输入长度为7的数组[2,3,1,0,2,5,3],那么对应的输出是2或者3。存在不合法的输入的话输出-1

解题思路:(1)直接遍历,结果时间超出限制

class Solution:
    def duplicate(self , numbers ):
        # write code here
        if len(numbers) == 0:
            return -1
        
        for i in range(len(numbers)):
            if numbers[i]>len(numbers)-1 or numbers[i]<0:
                return -1
            for j in range(len(numbers)):
                if numbers[i] == numbers[j] and i!=j:
                    return numbers[i]

(2)用字典

class Solution:
    def duplicate(self , numbers ):
        # write code here
        dic={}
        if not numbers:
            return -1
        for i in range(len(numbers)):
            if numbers[i] in dic:
                return numbers[i]
            else:
                dic[numbers[i]]=1

知识太薄弱了,这题对我竟然有点难度

7.23

题目:一个整型数组里除了两个数字只出现一次,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。

解题思路:利用字典,只出现一次的记为1,出现两次及以上的记为2,然后把字典中为1的数据另存为列表,对列表排序

class Solution:
    def FindNumsAppearOnce(self , array ):
        # write code here
        dic={}
        for i in range(len(array)):
            if array[i] in dic:
                dic[array[i]]=2
            else:
                 dic[array[i]]=1
        lis=[]
        for i in range(len(array)):
            if dic[array[i]] == 1:
                lis.append(array[i])
        lis.sort()
        return lis

注意:不能直接return lis.sort(),这样return的是None。sort()没有返回值,只是对原列表排序,所以要return原列表

试着优化一下:no idea 

题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。

解题思路:两个列表

class Solution:
    def reOrderArray(self , array ):
        # write code here
        list1=[]
        list2=[]
        for i in range(len(array)):
            if array[i]%2 != 0:
                list1.append(array[i])
            else:
                list2.append(array[i])
        for i in range(len(list2)):
            list1.append(list2[i])
        return list1

内存占的有点多: 把最后一个循坏改成:

list1.extend(list2)

 换成切片: list1[len(list1):len(list1)] = list2

7.27

题目:求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。

解题思路:看到这题的想法是递归,但是递归的结束条件怎么判断呢?又不能用if

高光:可以用return结束循环

# -*- coding:utf-8 -*-
class Solution:
    def Sum_Solution(self, n):
        # write code here
        return n and (n + self.Sum_Solution(n-1))
        

注意:需要研究一下 Python中的and和or的用法

7.29

一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶(n为正整数)总共有多少种跳法。

# -*- coding:utf-8 -*-
class Solution:
    def jumpFloorII(self, number):
        s=0
        if number == 1 or number == 2:
            return number
        if number >= 3:
                s =2* self.jumpFloorII(number-1)
                return s 

题目:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。

解题思路:一看就是一个斐波那契数列

class Solution:
    def jumpFloor(self, number):
        # write code here
        
        if number ==1 or number == 2:
            return number
        else:
            return self.jumpFloor(number-1) + self.jumpFloor(number-2)

但是,上面的代码竟然运行不通过!

class Solution:
    def jumpFloor(self, number):
        # write code here
        prev =1 
        curr=2
        if number ==1 or number == 2:
            return number
        else:
            for _ in range(3,number+1):
                prev,curr = curr,prev+curr
            return curr   

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值