LeetCode刷题之路 模糊坐标

模糊坐标【中等】

我们有一些二维坐标,如 "(1, 3)""(2, 0.5)",然后我们移除所有逗号,小数点和空格,得到一个字符串S。返回所有可能的原始字符串到一个列表中。

原始的坐标表示法不会存在多余的零,所以不会出现类似于"00", "0.0", "0.00", "1.0", "001", "00.01"或一些其他更小的数来表示坐标。此外,一个小数点前至少存在一个数,所以也不会出现“.1”形式的数字。

最后返回的列表可以是任意顺序的。而且注意返回的两个数字中间(逗号之后)都有一个空格。

示例 1:
输入: "(123)"
输出: ["(1, 23)", "(12, 3)", "(1.2, 3)", "(1, 2.3)"]
示例 2:
输入: "(00011)"
输出:  ["(0.001, 1)", "(0, 0.011)"]
解释: 
0.0, 00, 0001 或 00.01 是不被允许的。
示例 3:
输入: "(0123)"
输出: ["(0, 123)", "(0, 12.3)", "(0, 1.23)", "(0.1, 23)", "(0.1, 2.3)", "(0.12, 3)"]
示例 4:
输入: "(100)"
输出: [(10, 0)]
解释: 
1.0 是不被允许的。

提示:

  • 4 <= S.length <= 12.

  • S[0] = "(", S[S.length - 1] = ")", 且字符串 S 中的其他元素都是数字。

解题思路

首先利用切片将括号里的数字提取出来,然后进行数字的拆分,在拆分的数字里添加加小数点,添加小数点时要考虑的就是对首位或末尾为0数字的相关处理,不是首位或末尾为0的数字就直接进行迭代添加小数点即可(当然不要忘了返回不用添加小数点的数字)。最后将拆分添加小数点完成的数字列表通过itertools.product函数进行笛卡尔积的计算,转换成相应格式添加到返回的列表中。示例代码如下:

#摘自本题评论,笔者的代码有点麻烦,就不献丑了。
class Solution:
    def ambiguousCoordinates(self, S):
            """
            :type S: str
            :rtype: List[str]
            """
            S = S[1:-1]
            res = []
            # 加小数点
            def f(S):
                if not S or (len(S) > 1 and S[0] == "0" and S[-1] == "0"):
                    return []
                if S == "0":
                    return [S[0]]
                if S[0] == "0" and len(S) > 1:
                    return [S[0]+ "." + S[1:]]
                if S[-1] =="0" and len(S)  > 1:
                    return [S]
                return [S] +  [S[:i] + "." + S[i:] for i in range(1, len(S))]
            # 拆数字
            for i in range(1,len(S)):
                for x,y in itertools.product(f(S[:i]), f(S[i:])):
                    res.append("(%s, %s)"%(x,y))
            return res
附:

itertools.product(*iterables[, repeat])
返回一个迭代器,生成表示item1,item2等中的项目的笛卡尔积的元组,repeat是一个关键字参数,指定重复生成序列的次数。示例代码如下:

import itertools 

list1 = [1,2,3]
list2 = ['a','b','c']

for i in itertools.product(list1,list2):
    print(i)
    
print('-' * 30)

for i in itertools.product(list1,repeat=2):
    print(i)
    
print('-' * 30)
    
for i in itertools.product(range(4,7),repeat=2):
    print(i) 
    
'''
(1, 'a')
(1, 'b')
(1, 'c')
(2, 'a')
(2, 'b')
(2, 'c')
(3, 'a')
(3, 'b')
(3, 'c')
------------------------------
(1, 1)
(1, 2)
(1, 3)
(2, 1)
(2, 2)
(2, 3)
(3, 1)
(3, 2)
(3, 3)
------------------------------
(4, 4)
(4, 5)
(4, 6)
(5, 4)
(5, 5)
(5, 6)
(6, 4)
(6, 5)
(6, 6)
'''

itertools模块能够返回多种迭代器,包括无限迭代器,处理输入序列迭代器,组合生成器等等,感兴趣的朋友可以参考:https://www.jb51.net/article/65782.htm

推荐阅读更多精彩内容

  • 官网 中文版本 好的网站 Content-type: text/htmlBASH Section: User ...
    不排版阅读 2,376评论 0 5
  • 《裕语言》速成开发手册3.0 官方用户交流:iApp开发交流(1) 239547050iApp开发交流(2) 10...
    叶染柒丶阅读 10,118评论 4 16
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 4,305评论 0 17
  • 内置函数Python解释器内置了许多功能和类型,总是可用的。他们是按字母顺序列在这里。 abs(x)返回一个数的绝...
    uangianlap阅读 508评论 0 0
  • 这样的季节,这样的天气,当深秋后北方的雾霾如约定好的而来,天空被涂上了一层看不见的色彩 ,远方是那么的不觅踪迹,一...
    胡云鹏阅读 38评论 1 1