Leetcode刷题日志2.0

目录

前言: 

1.数字的补数

2.最大连续 1 的个数 

3.下一个更大元素 I 

4.斐波那契数

5.提莫攻击

6.557. 反转字符串中的单词 III


前言: 

        今天就分享一下最近刷到的leetcode习题吧 ,编程语言:Python3。废话不多说,请看题!

1.数字的补数

        对整数的二进制表示取反(0 变 1 ,1 变 0)后,再转换为十进制表示,可以得到这个整数的补数。

        例如,整数 5 的二进制表示是 "101" ,取反后得到 "010" ,再转回十进制表示得到补数 2 。现给你一个整数 num ,输出它的补数。

class Solution:
    def findComplement(self, num):
        b=bin(num)[2:]
        b=b.replace('0','a')
        b=b.replace('1','0')
        b=b.replace('a','1')
        return int(b,2)

方法:这道题可以这样子做,首先先把这个十进制数字转换为二进制数字符串,然后把这个二进制数字符串里面的‘0’全部替换为随便一个字符‘a’,然后再把里面的‘1’字符替换为‘0’,最后把‘a’替换为‘1’就OK了,这样就完成了二进制数补数的转换,然后通过int(b,2) 输出最终转换完成的十进制数就行了

2.最大连续 1 的个数 

给定一个二进制数组 nums , 计算其中最大连续 1 的个数。

class Solution:
    def findMaxConsecutiveOnes(self, nums):
        li=[]
        count=0
        nums.append(8)
        for i in nums:
            if i!=1:
                li.append(count)
                count=0
            else:
                count+=1
        return max(li)

 方法: 先创建一个列表存储 li ,然后就进入到循环,当遇到1的时候count就+1,如果没有遇到1的时候就把这个count放入 li 里面,最后我们会发现列表 li 里面的数字就是连续出现 1 的次数,最后只需要返回最大的那个就行了。

3.下一个更大元素 I 

nums1 中数字 x 的 下一个更大元素 是指 x 在 nums2 中对应位置 右侧 的 第一个 比 x 大的元素。

给你两个 没有重复元素 的数组 nums1 和 nums2 ,下标从 0 开始计数,其中nums1 是 nums2 的子集。

对于每个 0 <= i < nums1.length ,找出满足 nums1[i] == nums2[j] 的下标 j ,并且在 nums2 确定 nums2[j] 的 下一个更大元素 。如果不存在下一个更大元素,那么本次查询的答案是 -1 。

返回一个长度为 nums1.length 的数组 ans 作为答案,满足 ans[i] 是如上所述的 下一个更大元素 。

class Solution:
    def nextGreaterElement(self, nums1, nums2) :
        li = []
        for i in nums1:
            judge=False
            for j in range(nums2.index(i),len(nums2)):
                if nums2[j] > i:
                    judge=True
                    li.append(nums2[j])
                    break
            if not judge:
                li.append(-1)
        return li

方法: 这道题方法也是比较简单的,先对nums1 进行循环,在nums2 里面取到此时nums1的数字的位置,然后对nums2这个位置右边的数字进行循环,如果遇到大于此时的数字的话就把这个数字加入到列表li中,如果没有找到就添加-1

 4.斐波那契数

斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:

F(0) = 0,F(1) = 1
F(n) = F(n - 1) + F(n - 2),其中 n > 1
现在给定 n ,请计算 F(n) 。

class Solution:
    def fib(self, n):
        if n==0:
            return 0
        a=1
        b=1
        if n==1 or n==2:
            return 1
        while n>2:
            c=a+b
            a=b
            b=c
            n-=1
        return b

老题目了,不多讲

5.提莫攻击

在《英雄联盟》的世界中,有一个叫 “提莫” 的英雄。他的攻击可以让敌方英雄艾希(编者注:寒冰射手)进入中毒状态。

当提莫攻击艾希,艾希的中毒状态正好持续 duration 秒。

正式地讲,提莫在 t 发起攻击意味着艾希在时间区间 [t, t + duration - 1](含 t 和 t + duration - 1)处于中毒状态。如果提莫在中毒影响结束 前 再次攻击,中毒状态计时器将会 重置 ,在新的攻击之后,中毒影响将会在 duration 秒后结束。

给你一个 非递减 的整数数组 timeSeries ,其中 timeSeries[i] 表示提莫在 timeSeries[i] 秒时对艾希发起攻击,以及一个表示中毒持续时间的整数 duration 。

返回艾希处于中毒状态的 总 秒数。

class Solution:
    def findPoisonedDuration(self, timeSeries, duration) :
        time=0
        for i in range(len(timeSeries)):
            if i<len(timeSeries)-1:
                if timeSeries[i+1]-timeSeries[i]<=duration:
                    time+=timeSeries[i+1]-timeSeries[i]
                else:
                    time+=duration
        return time+duration

 方法:哈哈各位玩过英雄联盟吧,这里我们要分两步来走,首先把timeSeries分为最后一个时间段和最后一个时间段之前的时间段,因为最后一个时间段是不参与做比较的。然后对最后一个时间段之前的时间段进行循环,当后一个时间点与前一个时间点间隔时间小于或等于duration的时候我们就把time加上这两个时间点的差值,此时提莫的中毒技时间也开始刷新了;如果两个时间点的差值大于duration时,就直接把time加上duration就行了,最后在返回就结果记得加上最后一个时间段提莫中毒技能刷新之后的时间,实验加上duration就行了

6.557. 反转字符串中的单词 III

给定一个字符串 s ,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。

class Solution:
    def reverseWords(self, s) :
        li=s.split(' ')
        for i in range(len(li)):
            li[i]=li[i][::-1]
        return ' '.join(li)

 方法:首先我们把这个句子里面每一个单词提取出来,放入一个列表里面去,然后对这个列表进行循环,只需要把列表里面的每一个单词进行倒序就行了,最后再把这个列表单词之间用空格连接起来返回满足条件的字符串

好了,以上就是今天的习题内容了,我们下一期再见!! 

 分享一张壁纸:

猜你喜欢

转载自blog.csdn.net/m0_73633088/article/details/130409346