周賽332。

題目

輸入整數陣列nums。

串接指的是將兩個數字根據各個位數所合併起來。

  • 例如15和49的串接為1549

串接值最初為0。重複以下動作直到nums為空:

  • 如果nums存在超過一個數,則將第一個最後一個數字串接,將串接結果加入串接值中,並從nums中刪除
  • 如果只剩下一個數,直接將其加入串接值中,並刪除

求nums的串接值。

解法

這時候使用deque就很方便,可以直接從首尾取數字,也可以簡單的用len來檢查長度。

按照描述,每次首尾兩數,先轉成字串後連接起來,在轉回整數加入答案。最後如果有落單的數記得加入答案。

整數轉字串比較沒效率,時間複雜度O(N log max(nums)),其中N為nums長度。空間複雜度O(N)。

class Solution:
    def findTheArrayConcVal(self, nums: List[int]) -> int:
        ans=0
        q=deque(nums)
        ans=0
        
        while len(q)>1:
            a=q.popleft()
            b=q.pop()
            ans+=int(str(a)+str(b))
            
        if q:
            ans+=q[0]
            
        return ans

如果直接在nums上操作,就不需要額外的空間去做deque。

一樣每次取首尾兩個數字,只要算出後面那個數字有幾個位數,在前方數字補上相同數量的0就可以。

時間複雜度O(N log max(nums)),其中N為nums長度。空間複雜度O(1)。

class Solution:
    def findTheArrayConcVal(self, nums: List[int]) -> int:
        ans=0
        i=0
        j=len(nums)-1
        
        while i<j:
            x=nums[j]
            mul=1
            while x>0:
                mul*=10
                x//=10
            ans+=nums[i]*mul+nums[j]
            i+=1
            j-=1
            
        if i==j:
            ans+=nums[i]
            
        return ans