1 条题解

  • 0
    @ 2040-9-6 4:47:04

    【深基6.习4】数字反转(升级版)

    解题思路

    按 .、/、% 分离数字段,每段独立反转。整数形式的段去掉多余前导零;小数部分按数值形式同时去掉前导零与末尾零,至少保留一个零。保留原分隔符与段顺序。

    正确性说明

    逐段反转实现相应定义,清理多余零得到题目要求的标准数字形式,不改变分子分母或整数小数的位置。

    易错点

    数字可超过 64 位,不转整数;分数不约分;600.084 应为 6.48。

    复杂度

    时间 O(L),空间 O(L)。

    参考代码(C++11)

    #include <bits/stdc++.h>
    using namespace std;
    
    string rev(string s, bool decimal) {
        reverse(s.begin(), s.end());
        size_t p = s.find_first_not_of('0');
        if (p == string::npos)
            return "0";
        s.erase(0, p);
        if (decimal)
            while (s.size() > 1 && s.back() == '0')
                s.pop_back();
        return s;
    }
    int main() {
        ios::sync_with_stdio(false);
        cin.tie(nullptr);
        string s;
        cin >> s;
        size_t p = s.find_first_of("./%");
        if (p == string::npos) {
            cout << rev(s, false) << "\n";
        } else if (s[p] == '%') {
            cout << rev(s.substr(0, p), false) << "%\n";
        } else {
            cout << rev(s.substr(0, p), false) << s[p] << rev(s.substr(p + 1), s[p] == '.')
                 << "\n";
        }
        return 0;
    }
    
    • 1

    【深基6.习4】数字反转(升级版)

    信息

    ID
    111
    时间
    1000ms
    内存
    125MiB
    难度
    进阶
    标签
    递交数
    1
    已通过
    1
    上传者