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