题目描述:给定正整数 N ,我们按任何顺序(包括原始顺序)将数字重新排序,注意其前导数字不能为零。
如果我们可以通过上述方式得到 2 的幂,返回 true;否则,返回 false。
解题思路:
(1)通过枚举,把小于10^9的2的幂都枚举并记录。使用二维vector向量vector<vector<string>>类型记录这些2的幂,vector<string>记录每一组长度相等的2的幂;
(2)写一个计数器,统计输入数字N和2的幂p[i]的数字词频并记录在vector<int>向量中,因为vector可以直接进行相等比较;
代码如下:
#include<iostream>
#include<vector>
#include<string>
#include<math.h>
using namespace std;
class Solution {
public:
//pp一格是一个vector<string>,p一格是一个string
vector< vector<string> > pp;
vector<string> p;
//判断两个数每位的数字出现频率是否相等
bool isEqual(string &v, string &u) {
vector<int>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<string>数组
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<<solution.reorderedPowerOf2(n)<<endl;
return 0;
}
如果使用python,有自带的计数器Counter