題目描述
給你一個整數數組 digits,你能夠經過按任意順序鏈接其中某些數字來造成 3 的倍數,請你返回所能獲得的最大的 3 的倍數。node
因爲答案可能不在整數數據類型範圍內,請以字符串形式返回答案。c++
若是沒法獲得答案,請返回一個空字符串。git
示例1web
輸入:digits = [8,1,9]輸出:"981"
示例2算法
輸入:digits = [8,6,7,1,0]輸出:"8760"
示例3數組
輸入:digits = [1]輸出:""
示例4微信
輸入:digits = [0,0,0,0,0,0]輸出:"0"
提示編輯器
-
1 <= digits.length <= 10^4 -
0 <= digits[i] <= 9 -
返回的結果不該包含沒必要要的前導零。
題解
首先要知道一個小學生都知道的定理:若是一個數能夠被 整除,那麼它的每一位上的數之和也能夠被 整除,反之也成立。svg
那麼問題就轉化爲了挑選出最多的數,使得和是 的倍數。咱們能夠先求出全部數之和,記爲 ,而後有以下三種狀況:學習
-
若是 ,那麼全部數都選中就好了。 -
若是 ,那麼必須刪掉一個模 餘 的數(按照從小到大順序刪除 一、四、7)。若是這三個數都沒有,那就要刪除兩個模 餘 的數(按照從小到大順序刪除 二、五、8,刪除兩次)。 -
若是 ,那麼必須刪掉一個模 餘 的數(按照從小到大順序刪除 二、五、8)。若是這三個數都沒有,那就要刪除兩個模 餘 的數(按照從小到大順序刪除 一、四、7,刪除兩次)。
最終將剩下的數按照從小到大順序排序,拼接在一塊兒就好了。
注意若是有前導 ,就說明答案就是 。
時間複雜度爲 。
代碼
c++
class Solution {public: int del(vector<int>& cnt, int q) { for (int i = 0; i <= 9; ++i) { if (i%3 == q && cnt[i]) { return --cnt[i]; } } return -1; }
string largestMultipleOfThree(vector<int>& digits) { vector<int> cnt(10, 0); int sum = 0; for (auto x : digits) { cnt[x]++; sum += x; } int q = sum % 3; if (q && del(cnt, q) < 0) { del(cnt, 3-q); del(cnt, 3-q); } string res = ""; for (int i = 9; i >= 0; --i) { while (cnt[i]--) { res += i+'0'; } } if (res.size() && res[0] == '0') return "0"; return res; }};
做者簡介:godweiyang,知乎同名,華東師範大學計算機系碩士在讀,方向天然語言處理與深度學習。喜歡與人分享技術與知識,期待與你的進一步交流~
個人微信:weiyang792321264。有任何問題均可以在評論區留言,也歡迎加我微信深刻溝通~
本文分享自微信公衆號 - 算法碼上來(GodNLP)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。