816 模糊座標(python中的笛卡爾乘積)

1. 問題描述:

我們有一些二維座標,如 "(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 中的其他元素都是數字。

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/ambiguous-coordinates

2. 思路分析:

① 一開始的時候想到使用for循環進行組合,對於字符串中沒有0的情況那麼使用兩層for循環就可以解決了,但是假如存在0的情況的話就比較麻煩,因爲可能存在前導0與後導0,所以細節處理起來會有點麻煩

② 在領釦的評論區中學習到了一種新的解決的方法,使用itertools.product來表示笛卡爾積,因爲使用的是python3語言,所以可以使用python中的itertools.product來表示笛卡爾積的組合過程,product方法中的參數爲可迭代的對象,並且使用這個迭代的方法有一個好處是迭代的對象有一個爲空集的時候不會進行迭代了,這個是非常適用於出現前導0的情況,比如00與000等等我們判斷出這種情況返回空集就不會迭代了,實際上這個笛卡爾積本質上的兩個for循環的嵌套使用,python中對於這個方法的詳解如下:

https://docs.python.org/zh-cn/3.8/library/itertools.html#itertools.product

③ 剛開始學習python語言的時候做題看別人的代碼感覺可以學到比較多新的api,在列表的操作中比較常見的是迭代與切片操作,這樣對python的基礎的用法會熟悉一點

3. 代碼如下:

class Solution:
    def ambiguousCoordinates(self, S):
        S = S[1:-1]
        res = []
		# 加小數點
        def f(S):
            if not S or (len(S) > 1 and S[0] == "0" and S[-1] == "0"):
                # 返回空列表的時候product方法不會迭代
                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)):
            # itertools.product:笛卡爾積的組合過程
            for x,y in itertools.product(f(S[:i]), f(S[i:])):
                # 列表的添加元素操作
                res.append("(%s, %s)"%(x,y))
        return res

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章