PTA-1023-数字字符串转化

Have Fun with Numbers

解答:

用哈希表来表示一个数字映射这个数字的个数,当然也也可以用一个数组来存放0-9的个数,但是用哈希表时只用判断哈希表是否为空,如果用数组就要遍历这个数组是否都为0

#include<iostream>
#include<unordered_map>
using namespace std;
unordered_map<int,int>Map;

int main(){
    string Strnum;
    int digit[21]={0};//最多20位,超过了longlong的范围(19位)
    cin>>Strnum;
    for(int i=0;i<Strnum.size();i++){
        digit[i]=Strnum[Strnum.size()-i-1]-'0';//倒序放到数组中,忘:-'0'
        Map[digit[i]]++;
    }
    //进行翻倍处理
    int jw=0;//初始化个位时进位为0
    for(int i=0;i<Strnum.size();i++){
        digit[i]=digit[i]*2+jw;
        //考虑进位
        if(digit[i]>=10){
            digit[i]-=10;//因为只有从0-9的数字,所以2倍只会产生10-18的数字,只需要-10
            jw=1;//0-0进位最多为1
        }else{
            jw=0;
        }
        Map[digit[i]]--;
        //如果这个数的个数全部被抵消了,就把这个数从哈希表中的映射关系消除
        if(Map[digit[i]]==0) Map.erase(digit[i]);
    }
    if(jw==1){
        digit[Strnum.size()]=1;//最高位进1
        Map[digit[Strnum.size()]]--;//最高位1对应的个数-1
        if(Map[digit[Strnum.size()]]==0) Map.erase(digit[Strnum.size()]);//如果1的个数减1后使1的个数为0,清除1的映射
    }
    if(Map.size()==0){
        cout<<"Yes\n";
    }else{
        cout<<"No\n";
    }
    
    if(digit[Strnum.size()]==1)cout<<1;
    for(int i=Strnum.size()-1;i>=0;i--) cout<<digit[i];
    
    
    return 0;
}

对于当最高位还有进位就一定不满足题目条件的思考:
但这里如果不能将加入最高位进位1放入哈希表的操作取消,因为要通过哈希表是否为空来判断Yes与No的输出
改进jw==1(最高位还有进位)的部分如下:

int flag=0;
    if(jw==1){
        Map[Strnum.size()]=1;
        flag=1;
    }
    if(Map.size()==0){
        cout<<"Yes\n";
    }else{
        cout<<"No\n";
    }
    
    if(flag)cout<<1;
    for(int i=Strnum.size()-1;i>=0;i--) cout<<digit[i];
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值