字节跳动-多媒体嵌入式笔试

1、将若干数组合并,降序排列。

输入描述:第一行输入正整数n,表示数组个数。

后续n行,每行代表一个数组。

数组长度和<=10e6。数组元素值<=10e9。

示例

输入:

2

[1,4,6]

[2,3,5]

输出:

[6,5,4,3,2,1]

#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
#include <sstream>
using namespace std;
int main() {
    int n;
    cin >> n;
    cin.ignore();  // 忽略到行末,准备读取数组

    vector<long long> all_elements;  // 使用long long以支持大整数
    string line;
    while (n-- > 0) {
        getline(cin, line);  // 读取整行输入
        istringstream iss(line);
        char bracket, comma;
        long long num;

        iss >> bracket;  // 读取 '['
        while (iss >> num) {  // 读取每个数字
            all_elements.push_back(num);
            iss >> comma;  // 读取 ',' 或 ']'
        }
    }

    // 对所有元素进行降序排序
    sort(all_elements.begin(), all_elements.end(), greater<long long>());

    // 输出排序后的数组
    cout << '[';
    if (!all_elements.empty()) {
        cout << all_elements[0];
        for (size_t i = 1; i < all_elements.size(); ++i) {
            cout << ',' << all_elements[i];
        }
    }
    cout << ']' << endl;

    return 0;
}

2、将数组某个区间的元素各自进行翻转,希望最终所有的元素和尽可能大。

翻转就是将1234变为4321。

输入:第一行输入元素个数n,第二行输入n个正整数。

示例:

输入:

4

126 30 48 42

输出:

750(翻转 126 30 48)

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int reverseNumber(int num) {
    int rev = 0;
    while (num > 0) {
        rev = rev * 10 + num % 10;
        num /= 10;
    }
    return rev;
}

int maxSumAfterReverse(const vector<int>& nums) {
    int n = nums.size();
    vector<int> gain(n); // 存储每个元素翻转可能带来的增益
    int totalSum = 0; 
    // 计算每个元素的原始和和翻转增益
    for (int i = 0; i < n; ++i) {
        int reversed = reverseNumber(nums[i]);
        gain[i] = reversed - nums[i];
        totalSum += nums[i];
    }
    // 找到最大的增益子数组
    int maxGain = 0;
    int currentMax = 0;
    for (int i = 0; i < n; ++i) {//这里其实就转换成了计算最大连续子数组的和
        currentMax = std::max(gain[i], currentMax + gain[i]);
        maxGain = std::max(maxGain, currentMax);
    }
    // 计算可能的最大总和
    return totalSum + maxGain;
}

int main() {
    int n;
    cin >> n;

    vector<int> nums(n);
    for (int i = 0; i < n; ++i) {
        cin >> nums[i];
    }

    cout << maxSumAfterReverse(nums) << endl;
    return 0;
}

3、给定一个仅包含“YCH”字符的字符串,每次给定一个区间,输出重排给定区间子串可以得到 多少种不同的回文串。

输入:第一行输入正整数n,q,代表字符串的长度和给定的区间个数。

第二行输入长度为n的字符串。后续q行输入两个整数表示区间l,r。

示例:

4 3

YYCC

1 2

1 4

2 3

输出:

1

2

0

#include <iostream>
#include <vector>
#include <string>
using namespace std;
const int MOD = 1000000007;//这个是题意说的不会超过这个值

// 计算阶乘和阶乘的逆元
vector<long long> fact, ifact;

long long power(long long x, int y, int p) {
    long long res = 1;
    x = x % p;
    while (y > 0) {
        if (y & 1)
            res = (res * x)

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

嵌入式学习专栏 文章被收录于专栏

7年嵌入式软、硬件开发经验,分享嵌入式软件开发相关资料,简历、工作、技术支持!!!

全部评论
题都看不懂,难搞
点赞 回复 分享
发布于 05-27 19:54 重庆

相关推荐

3 12 评论
分享
牛客网
牛客企业服务