計算三的最大倍數

2021-10-03 04:08:17 字數 1557 閱讀 3818

今天參加了人生第一場leetcode周賽(手動狗頭)。除了感覺自己演算法能力薄弱之外,看到各路大神的解題思路不禁讓我虎軀一顫。默默掏出筆記本做起了筆記。

今天這道題是第177場周賽hard難度的壓軸題,即計算3的最大倍數。題目描述如下:

給你乙個整數陣列 digits,你可以通過按任意順序連線其中某些數字來形成 3 的倍數,請你返回所能得到的最大的 3 的倍數。

由於答案可能不在整數資料型別範圍內,請以字串形式返回答案。

如果無法得到答案,請返回乙個空字串。

性質如果n可以被3整除,則將數n各位相加,其和可以被3整除。 演算法

將vector陣列digits中的陣列按模3運算所得數分為三組(即餘數分別為0,1,2)。

將digits中所有數字相加,其和記為sum。

(1). 若sum等於0,則可以直接返回『0』;

(2). 若sum模3為1,則sum-1或sum-4後都能整除3。故我們可以從餘數為1的陣列中減去乙個最小的數,或者從餘數為2的陣列中減去兩個最小的數。

(3). 若sum模3為2,則sum-2可以整除3.故我們可以從餘數為1的陣列中減去兩個最小的數,或者從餘數為2的陣列中減去乙個最小的數。

將處理後的三個數組合到一起,倒序排列。

**

class

solution

for(i=

0;i<

3;i++

)sort

(a[i]

.begin()

,a[i]

.end()

,greater<

int>()

);if(s%3)

//如果模3不為0if(

!a[s%3]

.empty()

)//若餘數為1陣列或餘數為2陣列不為空

a[s%3]

.pop_back()

;else

//若模1陣列為空,可在模2陣列中減去2個(模2同理)

for(i=

0;i<

2;i++

) a[s%3^

3].pop_back()

;//異或操作即可避免繁瑣的if語句

for(i=

0;i<

3;i++

)for

(auto c:a[i]

) b.

push_back

(c);

sort

(b.begin()

,b.end()

,greater<

int>()

);ans="";

if(b.

empty()

||b.

front()

)for

(auto c:b) ans +

=to_string

(c);

else ans=

"0";

return ans;}}

;

大佬的**給我最大的感受就是異或操作,真的是讓人眼前一亮。

同時也紀念自己第一次寫部落格吧。

LeetCode 1363 形成三的最大倍數

1.3的倍數的每個數字和整除3 2.從一堆數字中,組成最大的數字,是讓數字從大到小排列 3.如果要刪掉乙個數字,刪掉最小的數字後組成的數字最大,因為刪掉其他的地方的,就由下乙個數字頂上。比較大小從高位開始比較,所以刪掉最後的數字,讓前面的數字都盡可能大。4.和的餘數多出1或2,只要刪掉乙個餘數為1的...

最大的最小公倍數

例如當n 5 時,不大於5的數為1 2 3 4 5。則應該選3 4 5三個數,它們的最小公倍數是60,在所有取法中是最大的。因此我們得到結果60。是不是很簡單?抓緊時間 ac 吧。7 這個題的意思就是要我們在1 n的範圍內找三個數,使他們的最小公倍數在這個範圍內的組合是最大的。那麼你的第一印象是什麼...

最大的最小公倍數

演算法訓練 最大最小公倍數 時間限制 1.0s 記憶體限制 256.0mb 問題描述 已知乙個正整數n,問從1 n中任選出三個數,他們的最小公倍數最大可以為多少。輸入格式 輸入乙個正整數n。輸出格式 輸出乙個整數,表示你找到的最小公倍數。樣例輸入 9 樣例輸出 504 資料規模與約定 1 n 106...