编程打卡第二天之重新排序得到2的幂

这篇博客介绍了如何用C++和Python解决一个编程挑战:判断一个正整数重新排列后是否能成为2的幂。文章首先通过枚举生成小于10^9的2的幂,并记录它们的字符串形式。接着,使用计数器对比输入数字和2的幂的数字词频,以确定它们是否相等。在C++中,作者使用了vector和string,而在Python中,利用了内置的Counter类。最后,给出了C++代码实现和主函数示例。
摘要由CSDN通过智能技术生成

题目描述:给定正整数 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值