aboutsummaryrefslogtreecommitdiff
path: root/balanced_num.cpp
blob: 779cb061af13cc5c4edd6256720beb0b960da7e5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
// 2048. Next Greater Numerically Balanced Number
#include "leetcode.h"

/*
 * an integer 'x' is numerically balanced if for every digit 'd' in the number
 * 'x', there are exactly 'd' occurences of that digit in 'x'. given an integer
 * 'n', return the smallest numerically balanced number strictly greater than
 * 'n'
 */

class Solution {
public:
  int nextBeautifulNumber(int n) {
    /*
        vector<int> all;
        for (int i = 0; i <= 1224444; ++i) {
          int v = i;
          unordered_map<int, int> m;
          while (v > 0) {
            ++m[v % 10];
            v /= 10;
          }
          for (auto &p : m) {
            if (p.first != p.second)
              goto L;
          }
          all.push_back(i);
        L:;
        }
    */
    static vector<int> all{
        0,      1,      22,      122,    212,    221,    333,    1333,   3133,
        3313,   3331,   4444,    14444,  22333,  23233,  23323,  23332,  32233,
        32323,  32332,  33223,   33232,  33322,  41444,  44144,  44414,  44441,
        55555,  122333, 123233,  123323, 123332, 132233, 132323, 132332, 133223,
        133232, 133322, 155555,  212333, 213233, 213323, 213332, 221333, 223133,
        223313, 223331, 224444,  231233, 231323, 231332, 232133, 232313, 232331,
        233123, 233132, 233213,  233231, 233312, 233321, 242444, 244244, 244424,
        244442, 312233, 312323,  312332, 313223, 313232, 313322, 321233, 321323,
        321332, 322133, 322313,  322331, 323123, 323132, 323213, 323231, 323312,
        323321, 331223, 331232,  331322, 332123, 332132, 332213, 332231, 332312,
        332321, 333122, 333212,  333221, 422444, 424244, 424424, 424442, 442244,
        442424, 442442, 444224,  444242, 444422, 515555, 551555, 555155, 555515,
        555551, 666666, 1224444,
    };
    return *upper_bound(all.begin(), all.end(), n);
  }
};

int main() {
  Solution obj;
  printf("%d\n", obj.nextBeautifulNumber(1));
  printf("%d\n", obj.nextBeautifulNumber(1000));
  printf("%d\n", obj.nextBeautifulNumber(3000));
}