Study Plan For Algorithms - Part15

WindMay發表於2024-08-29

1. 兩數相除
題目連結:https://leetcode.cn/problems/divide-two-integers/
給定兩個整數,被除數 dividend 和除數 divisor。將兩數相除,要求 不使用 乘法、除法和取餘運算。
整數除法應該向零截斷,也就是截去(truncate)其小數部分。例如,8.345 將被截斷為 8 ,-2.7335 將被截斷至 -2 。
返回被除數 dividend 除以除數 divisor 得到的 商 。

class Solution:
    def divide(self, dividend: int, divisor: int) -> int:
        if divisor == 0:
            raise ValueError("除數不為0")

        sign = (dividend < 0) ^ (divisor < 0)
        dividend = abs(dividend)
        divisor = abs(divisor)

        quotient = 0
        while dividend >= divisor:
            temp_divisor = divisor
            multiple = 1
            while dividend >= (temp_divisor << 1):
                temp_divisor <<= 1
                multiple <<= 1
            dividend -= temp_divisor
            quotient += multiple

        if sign:
            quotient = -quotient

        if quotient > 2**31 - 1:
            return 2**31 - 1
        elif quotient < -2**31:
            return -2**31
        else:
            return quotient

2. 串聯所有單詞的子串
題目連結:https://leetcode.cn/problems/substring-with-concatenation-of-all-words/
給定一個字串 s 和一個字串陣列 words。 words 中所有字串 長度相同。
s 中的 串聯子串 是指一個包含 words 中所有字串以任意順序排列連線起來的子串。
返回所有串聯子串在 s 中的開始索引。

from collections import Counter

class Solution:
    def findSubstring(self, s: str, words: List[str]) -> List[int]:
        if not s or not words:
            return []

        word_length = len(words[0])
        total_length = len(words) * word_length
        word_counts = Counter(words)
        result = []

        for i in range(len(s) - total_length + 1):
            current_words = [s[i + j * word_length: i + (j + 1) * word_length] for j in range(len(words))]
            current_counts = Counter(current_words)

            if current_counts == word_counts:
                result.append(i)

        return result

相關文章