阿里巴巴春季2023届校园招聘在线笔试考题

阿里巴巴春季2023届校园招聘在线笔试考题_第1张图片
阿里巴巴春季2023届校园招聘在线笔试考题_第2张图片

解题思路:

遍历每一位上的数字,找到最大的数字,推断其最小可能的进制(上限都是16)。然后按照所有可能的进制按从小到大的顺序,还原其十进制数形式。
注意:

  1. 这里在还原十进制数时需要一个取模10^9+7的操作,可能会爆int上限,所以用long long。
  2. 要求存在相同结果时只保留一个。当且仅当该数字仅存在一位时才能在不同进制下有相同结果,所以对此做一个特判输出原值。
  3. 输入有’A’~‘F’,所以是字符串输入,需要做整数的转换。

代码:

#include 
#include 
#include 
using namespace std;

long long mod(long long a, long long b, long long c) {  //指数取模函数,用来计算(a^b)%c
	long long ans = 1;
	while(b > 0) {
		if(b & 1) ans = ans * a % c;
		a = a * a % c;
		b >>= 1;
	}	
	return ans;
}

int main()
{
    string str;
    while(cin>>str)
    {
        if(str.size() == 1) {        //要求存在相同结果时只保留一个。当且仅当该数字仅存在一位时才能在不同进制下有相同结果,所以对此做一个特判输出原值
            long long t;
            char c = str[0];
            if(c >= '0' && c <= '9') t = c - '0';
            if(c >= 'A' && c <= 'F') t = c - 'A' + 10;
            cout<<t<<endl;
            continue;
        }
        vector<long long> temp;      //顺序存储每一位上的数字
        long long maxnum = 1;        //记录每一位数字中的最大值,maxnum+1即为最小可能的进制
        for(auto s : str)            //字符串转数字并存储
        {
            long long t;
            if(s >= '0' && s <= '9') t = s - '0';
            if(s >= 'A' && s <= 'F') t = s - 'A' + 10;
            temp.push_back(t);
            maxnum = max(maxnum, t);
        }
        long long ans;
        for(long long i = maxnum+1; i <= 16; i++)          //所有可能的进制从小到大顺序遍历
        {
            ans = 0;
            int k = 0;     //当前位数(个十百千万)
            for(long long j = temp.size()-1; j >= 0; j--)  //按当前进制把从低到高位的数字加起来,并取模
            {
                ans = (ans + temp[j]*mod(i,k,1000000007)) % 1000000007;
                k++;
            }
            cout<<ans<<endl;
        }
    }
    return 0;
}

时间复杂度O(n),空间复杂度O(n)。

另外两题:

阿里巴巴春季2023届校园招聘在线笔试考题_第3张图片
阿里巴巴春季2023届校园招聘在线笔试考题_第4张图片
阿里巴巴春季2023届校园招聘在线笔试考题_第5张图片
阿里巴巴春季2023届校园招聘在线笔试考题_第6张图片
阿里巴巴春季2023届校园招聘在线笔试考题_第7张图片
阿里巴巴春季2023届校园招聘在线笔试考题_第8张图片
阿里巴巴春季2023届校园招聘在线笔试考题_第9张图片

你可能感兴趣的:(刷题,算法,c++,数据结构)