二进制十六进制记得用位运算(牛客华为机试hj5)|刷题打卡

117 阅读1分钟

一、题目描述:

0)[}C6(OXX$L$$%6DP0.png

二、思路分析:

十六进制转十进制主要注意下每位是数字还是字母,因为ASCII码中,ABC和123并不是连着的,因此需要加个判断

if(s[i] <= 'F' && s[i] >= 'A'){
    tt += s[i] - 'A' + 10;
}else{
    tt += s[i] - '0';
}

注意要从前往后遍历的同时,跳过前两个点,这道题没有太坑,直接跳过前两个就可以,要是整个0x1230xAF那会稍微恶心一点

另一种方法是从后往前遍历,但需要维持一个系数变量,每次乘以16再相加,比上一个方法多用了一个变量

三、AC 代码:

#include<iostream>

using namespace std;

int main(){
    string s;
    while(cin >> s){
        int tt = 0;
        for(int i =2 ; i < s.size(); i++){
            tt = tt  << 4;
            if(s[i] <= 'F' && s[i] >= 'A'){
                tt += s[i] - 'A' + 10;
            }else{
                tt += s[i] - '0';
            }
        }
        printf("%d\n", tt);
    }
}

四、总结:

W{JHKAICDZTA6AR2$VKZ24.png

如图,我其实只是将tt = tt * 16改为了 tt = tt >> 4,通过位运算,竟然加快了一倍速度(或许某些题就是差在这里就超时间了)

本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情