恢復字串 演算法筆試模擬題精解

2021-10-08 08:21:07 字數 1112 閱讀 8703

給出兩個僅包含「+」、「-」兩種字元且長度相同字串 s1、s2,你需要通過填充數字將這兩個字串恢復成乙個合法的表示式。並且只能填入正整數,恢復後的表示式的值必須非負。

例如對於字串「±」,你可以將其變成「1+1-2」,但是不可以變成「1+1-3」,也不可以變成「1+0-1」。定義你的消耗為你填充的所有正整數的和。比如「1+1-2」的消耗為 1 + 1 + 2 = 4。你需要將這兩個字串都恢復成合法表示式,並且盡量的使它們的差值最小,於此同時你還需要使你的消耗最小。

相信你通過思考已經發現最小差值總是 0,因此你只需要求出差值為 0 時的最小消耗即可。字串長度都小於 100000。

輸入兩個字串 s1 和 s2。

輸出乙個數字,表示最小消耗。

示例 1

輸入:

「+±」

「–+」

輸出:

10注意

樣例最優解為「1+1+1-1」,「3-1-1+1」。

首先可以確定最小值一定為 0。分兩種情況討論。

兩個字串都沒有負號的時候,最優解的所有位置都填 1。最小消耗為 2*(n+1)。

表示式中僅需要有乙個負號,表示式的值就可以為任何值。此時兩個表示式可以相互調整,因此最小差也是 0。

表示式中除了第一位以外每位數字填 1 可以得到最小消耗,因為值加在哪一位都是等效的。

不妨假設都加在第一位。計算出 s1,s2 的正負號數量的差,分別為 x 和 y。假設第一位分別為 pa,pb,我們只需要使(pa+x==pb+y)即可。

假設最終表示式的值為 final,則 final=max(max(x, y) + 1, 0),則 pa=final-x,pb=final-y。

/**

* 恢復字串

* @param s1

* @param s2

* @return

*/public

static

intsolution

(string s1, string s2)

else

return ret;

}

演算法筆試模擬題精解之「一的個數」

前言 給你兩個數字l r,問在區間 l,r 內的所有數中,二進位制表示下 1 的個數最多的乙個數是多少,如果有多個相同的,輸出所有符合條件的數中最小的乙個數。輸入乙個整數l,和乙個整數r。1 l r 10 9 輸出乙個數字表示 l,r 內二進位制下 1 的個數最多的數。如果有多個,輸出符合條件的數中...

筆試 字串演算法題 翻轉分段字串

這個既然有人筆試完就問,那我還是敲乙份分享一下吧。題目大意 字串的問題,把字串按點的位置翻轉。要求時間複雜度o n 空間複雜度o 1 例如 對於字串 www.hyzhou.com.cn 輸出 cn.com.hyzhou.www 簡單明瞭,就不寫注釋了,是在看不懂,自己除錯執行看看過程就懂了。incl...

PPY的字串 字串模擬題

siry特別喜歡數學,在他很小的時候他就對數字特別感興趣,他喜歡念數字。具體唸法是這樣的 給你乙個數字,依次唸出每個數字有幾個相鄰 siry會大聲說出a個b,c個d.組合起來形成乙個新的數字。如 2331的唸法就是1個2,2個3,1個1,形成的新數字就是122311。再念一次就是1個1,2個2,1個...