大数和中的极值距离 |豆包MarsCode AI刷题

40 阅读2分钟

问题描述

小R面临的问题是计算两个由数字字符组成的超大字符串数相加后,得到的字符串数中最大数与最小数之间的位数差距。如果结果中所有数字都相同,则差距为0。如果存在多个符合最大或最小条件的数,应选择最小的位置差。

问题分析

这个问题可以分为以下几个步骤来解决:

  1. 字符串数相加:首先,需要将两个字符串数相加,得到一个新的字符串数。
  2. 寻找最大和最小数字:在得到的字符串数中,找到最大的数字和最小的数字。
  3. 计算位数差距:计算这两个数字在字符串中的位置差距。

算法设计

  1. 字符串数相加:使用循环从两个字符串的末尾开始逐位相加,注意进位。
  2. 寻找最大和最小数字:遍历得到的字符串数,记录下最大和最小数字及其位置。
  3. 计算位数差距:如果所有数字相同,则位数差距为0;否则,计算最大和最小数字的位置差。

代码实现

以下是C++语言的代码实现:

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

int solution(std::string string1, std::string string2) {
    // 反转字符串,方便从最低位开始相加
    std::reverse(string1.begin(), string1.end());
    std::reverse(string2.begin(), string2.end());

    int carry = 0;
    std::string result;
    for (size_t i = 0; i < std::max(string1.size(), string2.size()) || carry; ++i) {
        int digit1 = i < string1.size() ? string1[i] - '0' : 0;
        int digit2 = i < string2.size() ? string2[i] - '0' : 0;
        int sum = digit1 + digit2 + carry;
        result += (sum % 10) + '0';
        carry = sum / 10;
    }

    // 检查是否所有数字都相同
    if (result.size() == 1 || std::all_of(result.begin(), result.end(), [result](char c) { return c == result[0]; })) {
        return 0;
    }

    // 寻找最大和最小数字及其位置
    char maxDigit = '0', minDigit = '9';
    int maxPos = -1, minPos = -1;
    for (size_t i = 0; i < result.size(); ++i) {
        if (result[i] > maxDigit) {
            maxDigit = result[i];
            maxPos = i;
        }
        if (result[i] < minDigit) {
            minDigit = result[i];
            minPos = i;
        }
    }

    // 计算位数差距
    return maxPos - minPos;
}

int main() {
    // 测试用例
    std::cout << (solution("111", "222") == 0) << std::endl;
    std::cout << (solution("111", "34") == 1) << std::endl;
    std::cout << (solution("5976762424003073", "6301027308640389") == 6) << std::endl;

    return 0;
}

代码分析

  1. 字符串反转:为了从最低位开始相加,我们首先将两个字符串反转。
  2. 逐位相加:使用循环逐位相加,并处理进位。
  3. 寻找最大和最小数字:遍历结果字符串,记录下最大和最小数字及其位置。
  4. 计算位数差距:如果所有数字相同,则返回0;否则,返回最大和最小数字的位置差。