0202leetcode刷题5道python

16

题目描述:
给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。

示例:
在这里插入图片描述
解答:

class Solution:
    def threeSumClosest(self, nums: List[int], target: int) -> int:
        n = len(nums)
        nums.sort()
        re_min = 0 #存储当前最小的差值
        
        for i in range(n):
            low = i+1
            high = n-1
            while low < high:
                three_sum = nums[i] + nums[low] + nums[high]
                x = target - three_sum #当前三数的差值
                if re_min == 0:
                    re_min = abs(x)
                    sum_min = three_sum #sum_min为当前最接近的和
                
                if abs(x) < re_min:
                    re_min = abs(x)
                    sum_min = three_sum
                
                if three_sum == target:
                    return target
                elif three_sum < target:
                    low += 1
                else:
                    high -= 1
        
        return sum_min

424

题目描述:
给你一个仅由大写英文字母组成的字符串,你可以将任意位置上的字符替换成另外的字符,总共可最多替换 k 次。在执行上述操作后,找到包含重复字母的最长子串的长度。

示例:
在这里插入图片描述
解答:

class Solution:
    def characterReplacement(self, s: str, k: int) -> int:
        #滑动窗口
        from collections import defaultdict
        left = 0
        cur = defaultdict(int)
        res = 0
        for right, val in enumerate(s):
            cur[val] += 1
            # 找到目前最大字符个数,看该窗口是否多余翻转k个字符
            while right - left + 1 - max(cur.values()) > k:
                cur[s[left]] -= 1
                left += 1
            res = max(res, right - left + 1)
        return res

剑指offer58-I

题目描述:
输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. “,则输出"student. a am I”。

示例:
在这里插入图片描述
解答:

class Solution:
    def reverseWords(self, s: str) -> str:
        s = s.strip()                         # 删除首尾空格
        i = j = len(s) - 1
        res = []
        while i >= 0:
            while i >= 0 and s[i] != ' ':
                i -= 1                        # 搜索首个空格
            res.append(s[i + 1: j + 1])       # 添加单词
            while s[i] == ' ':
                i -= 1                        # 跳过单词间空格
            j = i                             # j 指向下个单词的尾字符
        return ' '.join(res)                  # 拼接并返回

面试题17.10

题目描述:
数组中占比超过一半的元素称之为主要元素。给定一个整数数组,找到它的主要元素。若没有,返回-1。

示例:
在这里插入图片描述
解答:

class Solution:
    def majorityElement(self, nums: List[int]) -> int:
        for i in set(nums):
            if nums.count(i)>len(nums)/2:
                return i
        return -1

面试题17.11

题目描述;
有个内含单词的超大文本文件,给定任意两个单词,找出在这个文件中这两个单词的最短距离(相隔单词数)。如果寻找过程在这个文件中会重复多次,而每次寻找的单词不同,你能对此优化吗?

示例:
在这里插入图片描述
解答:

class Solution:
    def findClosest(self, words: List[str], word1: str, word2: str) -> int:
        d=defaultdict(list)
        for i in range(len(words)):
            d[words[i]].append(i)
        res=float('inf')
        for i in d[word1]:
            for j in d[word2]:
                res=min(res,abs(i-j))
        return res

猜你喜欢

转载自blog.csdn.net/yeqing1997/article/details/113495631