题目:
一般来说,使用迭代器需要import 。product()函数可以将括号内的列表变成迭代器,用for循环进行随机组合。
整体思路:先满足各种特殊情况,再解决一般情况的打小数点问题(从特殊到一般);如果特殊情况想不到解法的话也可以直接面对答案编程,再解决一般问题。
做题感悟:这一题告诉我们,当题目的条件、逻辑比较多时,我们可以采用分治的思想,分开来解决问题。这里我是先单独看一串数字,对这一串数字定义函数dfs,解决了在哪里打点的问题后,再考虑逗号放哪里的问题。对于逗号,使用for循环随机拆分字符串s,分成两半喂给dfs函数得到的left解和right解再组合。
语句:(python3 有)
from itertools import product
解法:
class Solution:
def ambiguousCoordinates(self, s: str) -> List[str]:
def dfs(s): #该函数只考虑除了括号之后字符串在哪里打小数点
#这里是用函数优先排除特殊的各种情况,然后再用for循环进行普遍性打小数点
ans=[]
if s=='0': return ['0']
if s[0]!='0':
ans.append(s)
# if s[0]=='0':
# if s[-1]=='0':
# return []
# else: return ['0.'+s[1:]] 这行代码缺失了对s只有末尾为0的考虑
if s[-1]=='0':
if s[0]=='0':return [] #最好是返回空列表而不是None,因为None不可迭代,在后面的循环会出问题
return ans
else:
if s[0]=='0':return ['0.'+s[1:]]
for i in range(1,len(s)):
ans.append(s[:i]+'.'+s[i:])
return ans
n=len(s)
ans=[]
for i in range(2,n-1): #为什么这里从2开始?对s进行切片的时候s[2]是第二个数字,又由于切片操作是左闭右开区间,所以选s[1:i]时就是在i前面加入逗号!因为此时s[i]不在s[1:i]里面。
l=dfs(s[1:i])
r=dfs(s[i:n-1])
for x,y in product(l,r):
ans.append(f"({x}, {y})")#!!!!注意返回的两个数字中间(逗号之后)都有一个空格。
return ans
总结:这一题比较难的一点就是分清楚解决问题的先后,先解决小数点的问题or逗号放置的问题都行,就是分割成两部分,变成子问题再求解,有点分而治之的意思。比较不推荐的是两个逻辑一起写,非常容易乱从而导致WA