今天參加了人生第一場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...