C ++中的笔迹图数III

假设我们要定义一个函数来计算存在于(低和高)范围内的总频闪图数量。众所周知,频闪图数字是旋转180度时看起来相同的数字。

因此,如果输入像低=“ 50”,高=“ 100”,那么输出将为3,因为有三个结果,分别是69、88和96。

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

  • 定义一个函数findStrobogrammatic(),将花费n,

  • 定义数组ret

  • 如果n&1不为零,则-

    • 在ret的末尾插入“ 0”

    • 在ret的末尾插入“ 1”

    • 在ret的末尾插入“ 8”

  • 除此以外

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

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

    • s:= ret [i]

    • 如果n> 3,则-

    • 在临时文件末尾插入“ 1” + s +“ 1”

    • 在温度结尾处插入“ 8” + s +“ 8”

    • 在温度结尾处插入“ 6” + s +“ 9”

    • 在温度结尾处插入“ 9” + s +“ 6”

    • 在温度结尾处插入“ 0” + s +“ 0”

    • 定义阵列温度

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

    • ret:=临时

    • 返回ret

    • 从主要方法中,执行以下操作-

    • ret:= 0

    • 定义数组v

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

      • ret:= ret +(当v [j]的长度>低长度的AND AND高的长度> v [j]的长度时为1)

      • v:= findStrobogrammatic(i)

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

    • 返回ret

    示例

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

    #include <bits/stdc++.h>
    using namespace std;
    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;
       }
       bool compare(string a, string b){
          return a.size() == b.size() ? a >= b : a.size() > b.size();
       }
       int strobogrammaticInRange(string low, string high) {
          int ret = 0;
          vector<string> v;
          for (int i = low.size(); i <= high.size(); i++) {
             v = findStrobogrammatic(i);
             for (int j = 0; j < v.size(); j++) {
                ret += compare(v[j], low) && compare(high, v[j]);
             }
          }
          return ret;
       }
    };
    main(){
       Solution ob;
       cout <<(ob.strobogrammaticInRange("50", "100"));
    }

    输入值

    "50","100"

    输出结果

    3