leetcode刷题(按身高排序、两个非重叠子数组的最大和、删除链表的倒数第N个结点、有效时间的数目、可被k整除的最小整数、合并两个有序数组、删除有序数组中的重复项2、多数元素)

目录

1、按身高排序

2、两个非重叠子数组的最大和

3、删除链表的倒数第N个结点

4、有效时间的数目

5、 可被k整除的最小整数

6、合并两个有序数组

7、 删除有序数组中的重复项2

8、 多数元素


1、按身高排序

class Solution:
    def sortPeople(self, names: List[str], heights: List[int]) -> List[str]:
        n = len(names)   #就计算names列表的长度
        idx = list(range(n))    #返回一个下标列表,比如n = 5,则返回[0,1,2,3,4]
        idx.sort(key=lambda x: heights[x], reverse=True)   #按照height[x]里面的值的大小进行排序,因为是降序,所以翻转
        res = []
        for i in idx:    #再一个一个加进去
            res.append(names[i])
        return res

2、两个非重叠子数组的最大和

3、删除链表的倒数第N个结点

4、有效时间的数目

class Solution:
    def countTime(self, time: str) -> int:
        # 简单模拟题,组合数学,疯狂分类讨论即可
        ans = 1
        if time[4] == "?":          # mm为"x?",则"?"有10种情况
            ans *= 10   
        if time[3] == "?":          # mm为"?x",则"?"有6种情况
            ans *= 6
        if time[:2] == "??":        # hh为"??",则"??"有24种情况
            ans *= 24
        elif time[1] == "?":        # hh为"x?"(x不为?),则考虑x的值
            if time[0] == "2":          # x为2,则"?"有4种情况
                ans *= 4
            else:                       # x为0或1,则"?"有10种情况
                ans *= 10   
        elif time[0] == "?":        # hh为"?x"(x不为?),则考虑x的值
            if time[1] >= "4":          # x大于等于4,则"?"只能取0或1,有2种情况
                ans *= 2
            else:                       # x小于4,则"?"可以取0或1或2,有3种情况
                ans *= 3
        return ans                  # 所有可能的情况乘起来,简单的组合数学,即为答案

5、 可被k整除的最小整数

class Solution:
    def smallestRepunitDivByK(self, k: int) -> int:
        n = 1 % k   #n是用来计算仅含1的整数的,k如果是1,则直接为0,否则为1
        for i in range(1, k + 1):
            if n == 0:
                return i    #如果一上来直接就==0,则证明k是1,不然则将继续
            n = (n * 10 + 1) % k
        return -1

6、合并两个有序数组

class Solution:
    def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
        k = m + n - 1    #目标数组总长度, k是下标
        while m > 0 and n > 0:   #只要两个数组任意一个遍历完
            if nums1[m-1] > nums2[n-1]:  #1数组最后一个数比2数组最后一个数大
                nums1[k] = nums1[m-1]   #将1数组最后一个移到目标数组最后一个
                m -= 1   #1数组的指针左移
            else:
                nums1[k] = nums2[n-1]   #与上面一个if相反
                n -= 1
            k -= 1   #目标数组指针左移
        nums1[:n] = nums2[:n]   #题目性质保证了m肯定比n大,把nums2剩下来的直接拿过来放到目标数组前面
        return nums1

7、 删除有序数组中的重复项2

class Solution(object):
    def removeDuplicates(self, nums):
        slow = 0
        for fast in range(len(nums)):
            if slow < 2 or nums[fast] != nums[slow - 2]:   #前面的两个位置以及后面的判断,因为不能出现同一个数超过两次
                nums[slow] = nums[fast]
                slow += 1
        return slow

8、 多数元素

class Solution:
    def majorityElement(self, nums: List[int]) -> int:
        # nums.sort()
        # return nums[len(nums)//2]     #出现次数大于n/2向下取整,那么就证明最多只有一个多数,而且在第一一半的位置肯定是这个数,不管他多大
        #超过一般的为多数,可以使用一种方法叫做摩尔投票法
        major = 0
        count = 0
        for n in nums:
            if count == 0:
                major = n
            if n == major:
                count += 1
            else:
                count -= 1
        return major 

猜你喜欢

转载自blog.csdn.net/Starinfo/article/details/130375279