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