青训营X豆包MarsCode 技术训练营 字节青训营笔记6| 豆包MarsCode AI刷题

65 阅读3分钟

数字字符串格式化

问题描述

小M在工作时遇到了一个问题,他需要将用户输入的不带千分位逗号的数字字符串转换为带千分位逗号的格式,并且保留小数部分。小M还发现,有时候输入的数字字符串前面会有无用的 0,这些也需要精简掉。请你帮助小M编写程序,完成这个任务。

测试样例

样例1:

输入:s = "1294512.12412" 输出:'1,294,512.12412'

样例2:

输入:s = "0000123456789.99" 输出:'123,456,789.99'

样例3:

输入:s = "987654321" 输出:'987,654,321'

问题分析:

去除前导零:输入的数字字符串可能有不必要的前导零,需要在处理时去掉这些零。

处理千分位:整数部分需要按照每三位插入一个逗号(eg:1234567 变为 1,234,567)。

处理小数部分:如果存在小数部分,应该将其保留,并附加到处理后的整数部分。

step1: 分离整数和小数部分, 首先需要检查输入字符串是否包含小数点,通过 find() 方法找到小数点的位置,若有则分离整数和小数部分。

  1. 使用 find('.') 方法检查小数点的位置。如果找到小数点,就用 substr() 方法将整数部分和小数部分分开。如果没有小数点,fractional_part 为空。

step2: 去掉前导零, 对整数部分进行处理,去掉多余的前导零。

  1. 用一个 while 循环检查整数部分的首字符是否为零。如果是零,移除它,直到整数部分不再以零开始。注意,如果整数部分为空(原始输入为 0.001),要将整数部分设置为 "0"

step3: 添加千分位逗号, 从整数部分的最后一位开始,通过从右向左遍历整数部分,每隔三个字符就插入一个逗号。count 用于记录已经插入的数字个数,每三个数字就插入一个逗号。

step4: 组合整数和小数部分:如果存在小数部分,直接连接整数部分和小数部分。

返回结果, 将处理后的整数部分与小数部分拼接起来。

代码如下

#include <string>
#include <iostream>
#include <sstream>
#include <algorithm>

std::string solution(const std::string& s) {
    std::string str = s;
    size_t dot_pos = str.find('.');
    std::string integer_part = str;
    std::string fractional_part = "";
    if (dot_pos != std::string::npos) {
        integer_part = str.substr(0, dot_pos);
        fractional_part = str.substr(dot_pos);
    }
    while (integer_part.size() > 1 && integer_part[0] == '0') {
        integer_part.erase(0, 1);
    }
    if (integer_part.empty()) {
        integer_part = "0";
    }
    std::string result = "";
    int count = 0;
    for (int i = integer_part.size() - 1; i >= 0; --i) {
        result = integer_part[i] + result;
        count++;
        if (count == 3 && i != 0) {
            result = "," + result;
            count = 0;
        }
    }
    result += fractional_part;
    return result;
}

int main() {
    std::cout << (solution("1294512.12412") == "1,294,512.12412") << std::endl;
    std::cout << (solution("0000123456789.99") == "123,456,789.99") << std::endl;
    std::cout << (solution("987654321") == "987,654,321") << std::endl;
    return 0;
}

构造特定数组的逆序拼接

问题描述

小U得到了一个数字n,他的任务是构造一个特定数组。

这个数组的构造规则是:对于每个i从1到n,将数字n到i逆序拼接,直到i等于n为止。

最终,输出这个拼接后的数组。

例如,当n等于3时,拼接后的数组是 [3, 2, 1, 3, 2, 3]。

测试样例

样例1:

输入:n = 3 输出:[3, 2, 1, 3, 2, 3]

样例2:

输入:n = 4 输出:[4, 3, 2, 1, 4, 3, 2, 4, 3, 4]

样例3:

输入:n = 5 输出:[5, 4, 3, 2, 1, 5, 4, 3, 2, 5, 4, 3, 5, 4, 5]

问题分析

输入:n = 5

输出:[

5, 4, 3, 2, 1,

5, 4, 3, 2,

5, 4, 3,

5, 4,

5]

外层循环控制输出层数,内层循环控制输出每层个数。

#include <vector>
#include <iostream>
using namespace std;

vector<int> solution(int n) {
    vector<int> result;
    for (int i = 1; i <= n; i++) {
        for (int j = n; j >= i; j--) {
            result.push_back(j);
        }
    }
    return result;
}

int main() {
    vector<int> result1 = solution(3);
    cout << (result1 == vector<int>{3, 2, 1, 3, 2, 3}) << endl;
    vector<int> result2 = solution(4);
    cout << (result2 == vector<int>{4, 3, 2, 1, 4, 3, 2, 4, 3, 4}) << endl;
    vector<int> result3 = solution(5);
    cout << (result3 == vector<int>{5, 4, 3, 2, 1, 5, 4, 3, 2, 5, 4, 3, 5, 4, 5}) << endl;
    return 0;
}