從數字陣列中查詢 3 的最大倍數 - C++ 中的 Set 2


假設我們有一個包含不同數字的陣列;我們必須找到透過以任何順序連線該陣列中某些給定數字生成的 3 的最大倍數。答案可能非常大,因此將其作為字串。如果沒有答案,則返回空字串。

因此,如果輸入類似於 [7, 2, 8],則輸出將為 87。

為了解決這個問題,我們將遵循以下步驟 -

  • 定義一個二維陣列 d,將有三行

  • 對陣列數字進行排序

  • sum := 0

  • 對於初始化 i := 0,當 i < 數字大小,更新(i 增加 1),執行 -

    • x := digits[i]

    • 將 digits[i] 插入到 d[x mod 3] 的末尾

    • sum := sum + x

    • sum := sum mod 3

  • 如果 sum 不為零,則 -

    • 如果 d[sum] 的大小不為 0,則 -

      • rem := 3 - sum

      • 如果 d[rem] 的大小 < 2,則 -

        • 返回空字串

      • 從 d[rem] 中刪除最後一個元素兩次

    • 否則

      • 從 d[sum] 中刪除最後一個元素

  • ret := 空字串

  • 對於初始化 i := 0,當 i < 3,更新(i 增加 1),執行 -

    • 對於初始化 j := 0,當 j < d[i] 的大小,更新(j 增加 1),執行 -

      • ret := ret 連線 d[i, j] 作為字串

  • 對陣列 ret 進行排序

  • 如果 ret 的大小和 ret[0] 與 '0' 相同,則 -

    • 返回 "0"

  • 返回 ret

示例

讓我們看看以下實現以更好地理解 -

即時演示

#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
   string largestMultipleOfThree(vector<int>& digits) {
      vector<vector<int>> d(3);
      sort(digits.begin(), digits.end(), greater<int>());
      int sum = 0;
      for (int i = 0; i < digits.size(); i++) {
         int x = digits[i];
         d[x % 3].push_back(digits[i]);
         sum += x;
         sum %= 3;
      }
      if (sum) {
         if (!d[sum].size()) {
            int rem = 3 - sum;
            if (d[rem].size() < 2)
               return "";
            d[rem].pop_back();
            d[rem].pop_back();
         }
         else {
            d[sum].pop_back();
         }
      }
      string ret = "";
      for (int i = 0; i < 3; i++) {
         for (int j = 0; j < d[i].size(); j++) {
            ret += to_string(d[i][j]);
         }
      }
      sort(ret.begin(), ret.end(), greater<int>());
      if (ret.size() && ret[0] == '0')
         return "0";
      return ret;
   }
};
main(){
   Solution ob;
   vector<int> v = {7,2,8};
   cout << (ob.largestMultipleOfThree(v));
}

輸入

{7,2,8}

輸出

87

更新於: 20-Aug-2020

117 次檢視

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.