假设我们要定义一个函数来计算存在于(低和高)范围内的总频闪图数量。众所周知,频闪图数字是旋转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