Leetcode Contest 23
今晚有手撕鸡,玉米鸡汤,红烧牛排骨和金鲳鱼。本来还准备了要做个豆豉炒苦瓜的,但是那手撕鸡实在太大了,所以就苦瓜没有必要做了。这手撕鸡很好吃:先是用鸡熬两个小时做鸡汤,然后将鸡过冷水去骨撕条,在鸡肉上放上辣椒面与白芝麻并浇以热油,最后加上些许醋拌匀即可。
这次比赛比较简单,但是还是WA了两次了,顺带吐槽一下自己写代码的速度。
第一题Reverse String II
没什么好说的,就直接干就好:首先将字符串按长度为2k分块,然后处理每一个分块。
class Solution(object):
def reverseStr(self, s, k):
"""
:type s: str
:type k: int
:rtype: str
"""
lst = []
for i in xrange(0, len(s), 2*k):
lst.append(s[i:i+2*k])
for i, s in enumerate(lst):
lst[i] = s[:k][::-1]+s[k:]
return ''.join(lst)
第二题Minimum Time Difference
首先将"hh:mm"转化成分钟形式:60*hh+mm,然后排序。排序后寻找相邻两个数之间的差的最小值,最后处理一下第一个数与最后一个数之间的差。
class Solution(object):
def findMinDifference(self, timePoints):
"""
:type timePoints: List[str]
:rtype: int
"""
def get(x):
return int(x[:2])*60+int(x[3:])
tp = sorted(map(get, timePoints))
ans = 2 ** 31
for i in xrange(len(tp)-1):
ans = min(ans, tp[i+1]-tp[i])
ans = min(ans, get('24:00')-tp[-1]+tp[0])
return ans
第三题Construct Binary Tree from String
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def str2tree(self, s):
"""
:type s: str
:rtype: TreeNode
"""
if not s:
return None
def build(s):
i = j = 0
while i < len(s) and s[i] != '(':
i += 1
root = TreeNode(int(s[:i]))
j = i
if i < len(s):
c = 1
j = i + 1
while j < len(s) and c != 0:
if s[j] == '(':
c += 1
elif s[j] == ')':
c -= 1
j += 1
root.left = build(s[i+1:j-1])
i = j
if i < len(s):
root.right = build(s[i+1:len(s)-1])
return root
return build(s)
第四题Word Abbreviation
我的解法:假设前缀长度为k(初始k为1),然后扫描没有被缩写的字符串,将其缩写后的结果保存在一个哈希表里。这个哈希表是以缩写之后的字符串为键值,其对应的是所有缩写到该键值的字符串的位置的列表。最后扫描这个哈希表,如果只有一个字符串缩写到对应键值,那么就找到了一个可行的缩写了。接着k的值增加1,重复上诉步骤直到所有字符串都有唯一缩写。
需要注意的一点是,在上述扫描的过程中,可能遇到一些不用被缩略的字符串。对于它们,就没有必要放进哈希表了。
from collections import defaultdict
class Solution(object):
def wordsAbbreviation(self, dict):
"""
:type dict: List[str]
:rtype: List[str]
"""
n = len(dict)
ans = [''] * n
visited = [False] * n
k = 1
while n > 0:
tmp = defaultdict(list)
for i, w in enumerate(dict):
if visited[i]:
continue
if k + 2 >= len(w):
ans[i] = w
n -= 1
visited[i] = True
else:
tmp[w[:k]+str(len(w)-k-1)+w[-1]].append(i)
for t, v in tmp.items():
if len(v) == 1:
ans[v[0]] = t
visited[v[0]] = True
n -= 1
k += 1
return ans