0202leetcodeは5つのPythonの質問をブラシします

16

タイトルの説明:
n個の整数とターゲット値targetを含む配列numsが与えられます。それらの合計がターゲットに最も近くなるように、numsで3つの整数を見つけます。これらの3つの数値の合計を返します。入力のセットごとに1つの答えしかないと仮定します。

例:
ここに画像の説明を挿入
回答:

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を指します

タイトルの説明:
英語の文を入力し、文の単語の順序を逆にしますが、単語の文字の順序は変わりません。簡単にするために、句読点は通常の文字のように扱われます。たとえば、「私は学生です。」という文字列を入力してから、「学生。aamI」を出力します。

例:
ここに画像の説明を挿入
回答:

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

タイトルの説明;
単語を含む大きなテキストファイルがあり、任意の2つの単語が与えられた場合、このファイル内のこれら2つの単語間の最短距離(分離された単語の数)を見つけます。このファイルで検索プロセスが複数回繰り返され、そのたびに検索される単語が異なる場合、これを最適化できますか?

例:
ここに画像の説明を挿入
回答:

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