题目描述:给定正整数 N ,我们按任何顺序(包括原始顺序)将数字重新排序,注意其前导数字不能为零。
如果我们可以通过上述方式得到 2 的幂,返回 true;否则,返回 false。
解题思路:
(1)通过枚举,把小于10^9的2的幂都枚举并记录。使用二维vector向量vector
(2)写一个计数器,统计输入数字N和2的幂p[i]的数字词频并记录在vector
代码如下:
#include#include #include #include using namespace std; class Solution { public: //pp一格是一个vector ,p一格是一个string vector< vector > pp; vector p; //判断两个数每位的数字出现频率是否相等 bool isEqual(string &v, string &u) { vector v1, u1;//计数器 v1.assign(10, 0); u1.assign(10, 0); for (int i = 0; i < v.size(); i++) {//分别记录u和v中数字出现的频率; v1[v[i] -'0'] += 1; u1[u[i] -'0'] += 1; } return v1 == u1; } bool reorderedPowerOf2(int n) { int i, j; string sn; //枚举所有小于10^9的2的幂 i = 0, j = 1; while (pow(2, i) < 1100000000) { //把2的幂转成字符串类型 sn = to_string((int)pow(2, i)); //长度相同的2的幂归为一个vector 按字符串长度把各个2的幂分组(行) if (sn.size() - j == 0) p.push_back(sn); else { j++;//2的幂的长度; pp.push_back(p);//长度加1,把上一组长度相同的幂加入vector 数组 p.clear(); p.push_back(sn); }//else i++; }//whike //匹配 sn = to_string(n); i = sn.size()-1; //获取第sn.size()-1行的2的幂 p = pp[i]; //遍历pp的第sn.size()行 for (j = 0; j < p.size(); j++) { if (isEqual(p[j], sn)) { return true; }//if }//for return false; } }; int main() { Solution solution; int n; cin >> n; cout< 如果使用python,有自带的计数器Counter



