周賽364。

題目

輸入二進位字串s,其中至少包含一個’1’。

你必須將這些位元重排列,使得其成為可能的最大奇數

回傳重排列後的最大奇數二進位字串。

注意:字串可以擁有前導零。

解法

二進位每個位元所代表的是1, 2 ,4 …,只要第一個位元是1,則這個數字一定是奇數。
題目保證至少有一個1,所以先把第一個位元填上1。

假設長度N的字串中有one個1,有一個要填到最後面。剩下one-1個,還有zero = N-one個0要填。
為了使數值較大,則優先把剩下的1都填到左邊,剩下的0放中間。

時間複雜度O(N)。
空間複雜度O(N)。

class Solution:
    def maximumOddBinaryNumber(self, s: str) -> str:
        N=len(s)
        one=s.count("1")
        zero=N-one
        
        one-=1
        
        return "1"*one + "0"*zero +"1"

也可以先建立長度N的陣列,初始都是0。
填上最右邊的1,然後從左邊開始填剩下的1。

時間複雜度O(N)。
空間複雜度O(N)。

class Solution:
    def maximumOddBinaryNumber(self, s: str) -> str:
        N=len(s)
        a=["0"]*N
        a[-1]="1"
        
        for i in range(s.count("1")-1):
            a[i]="1"
            
        return "".join(a)