C ++中的笔迹图数

假设我们的长度为n。我们必须找到所有长度为n的频闪图数字。

众所周知,频闪图数字是旋转180度时看起来相同的数字。

因此,如果输入像n = 2,则输出将为[“ 11”,“ 69”,“ 88”,“ 96”]

为了解决这个问题,我们将遵循以下步骤-

  • 定义数组ret

  • 如果n为奇数,则-

    • 在ret的末尾插入“ 0”

    • 在ret的末尾插入“ 1”

    • 在ret的末尾插入“ 8”

  • 除此以外

    • 在ret的末尾插入空白字符串

  • 对于n> 1,更新n:= n-2,-

    • s:= ret [i]

    • 如果n> 3,则-

    • 在临时结尾处插入“ 1”并置“ 1”

    • 在临时结尾处插入“ 8”并置“ 8”

    • 在临时结尾处插入“ 6”并置“ 9”

    • 在临时结尾处插入“ 9”并置“ 6”

    • 在临时结尾处插入“ 0”并置“ 0”

    • 定义阵列温度

    • 对于初始化i:= 0,当i <ret的大小时,更新(将i增加1),执行-

    • ret:=临时

    • 返回ret

    例 

    让我们看下面的实现以更好地理解-

    #include <bits/stdc++.h>
    using namespace std;
    void print_vector(vector<auto< v){
       cout << "[";
       for(int i = 0; i<v.size(); i++){
          cout << v[i] << ", ";
       }
       cout << "]"<<endl;
    }
    class Solution {
    public:
       vector<string< findStrobogrammatic(int n) {
          vector<string< ret;
          if (n & 1) {
             ret.push_back("0");
             ret.push_back("1");
             ret.push_back("8");
          }
          else {
             ret.push_back("");
          }
          for (; n > 1; n -= 2) {
             vector<string< temp;
             for (int i = 0; i < ret.size(); i++) {
                string s = ret[i];
                if (n > 3) {
                   temp.push_back("0" + s + "0");
                }
                temp.push_back("1" + s + "1");
                temp.push_back("8" + s + "8");
                temp.push_back("6" + s + "9");
                temp.push_back("9" + s + "6");
             }
             ret = temp;
          }
          return ret;
       }
    };
    main(){
       Solution ob;
       print_vector(ob.findStrobogrammatic(3));
    }

    输入项

    3

    输出结果

    [101, 808, 609, 906, 111, 818, 619, 916, 181, 888, 689, 986, ]