蚂蚁集团2022-09-15笔试

第一题

小红每次可以把一个字符变成两个字母表中比它小一位的字符。例如,可以把’b’变成两个’a’,可以把z’变成两个’y。
小红希望最终可以生成x个’a’,你能帮小红求出初始的字符串吗?请你输出长度最短的合法字符串,有多解时输出任意即可。

输入描述:
一个正整数x,代表最终的’a’的数量。
1 <= x <= 1000

输出描述:
一个字符串,代表小红操作前的字符串。如果有多个合法解,输出任意一个合法字符串即可。但需要保证输出的是最短字符串。

示例:
输入
5
输出
ca

参考代码:

#include 
using namespace std;
int helper(int i){
        i |= (i >>  1);
        i |= (i >>  2);
        i |= (i >>  4);
        i |= (i >>  8);
        i |= (i >> 16);
        return i - (i >> 1);
}

int main(){
    int a = 1000;
    string str;
    while(__builtin_popcount(a) != 1){
        int x = helper(a);
        str.push_back(char('a' + __builtin_ffs(x) - 1));
        a = a - x;
    }
    str.push_back(char('a' + __builtin_ffs(a) - 1));
    cout << str << endl;
    return 0;
}

测试
5
ca
6
cb
7
cba

第三题

小红定义一个字符串是好串,当且仅当只有一个字符出现的次数为奇数,其它字母均为偶数。
小红拿到了一个字符串,她想知道该字符串有多少子串是好串?子串的定义:一个字符串取一段连续的区间得到的新字符串。例如"arcaea"的子串有"arc"、"ca"等,但"ara”则不是它的子串。

输入描述:
一个不超过200000的,仅由小写字母组成的字符串。
输出描述:
好子串的数量

用例:
输入:
ababa
输出:
9

参考代码:

#include 
using namespace std;

unordered_set<string> mp;
int ans = 0;
void Substring(string str){
    for(int i = 0; i < str.size(); i++){
        for(int j = 1; j <= ((str.substr(i)).size()); j++){
            string s = str.substr(i, j);
            if(mp.find(s) != mp.end()){
                ans++;
            }else{
                unordered_map<int, int> tr;
                for(char ch : s) tr[ch]++;
                int jishu = 0;
                for(auto &[_, v] : tr){
                    if(v % 2 != 0){
                        jishu++;
                    }
                }
                if(jishu == 1){
                    ++ans;
                    mp.insert(s);
                }
            }
        }
    }
}

int main(){
	string str;
	cin >> str;
	Substring(str);
	cout << ans << endl;
	return 0;
}

上述代码没有在考试平台上提交,正确与否不知,只知道测试用例和思路应该没问题!

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