牛客网面试必刷TOP101-08字符串BM86 大数加法

描述

以字符串的形式读入两个数字,编写一个函数计算它们的和,以字符串形式返回。

数据范围:s.length,t.length≤100000,字符串仅由'0'~‘9’构成

要求:时间复杂度 O(n)

示例1

输入:

"1","99"

返回值:

"100"

说明:

1+99=100       

示例2

输入:

"114514",""

返回值:

"114514"
一、问题分析

首先读题,仔细看描述中的内容,发现需求是

1.以字符串的形式读入两个数字,编写一个函数计算它们的和,以字符串形式返回。

2.数据范围:s.length,t.length小于等于10万,字符仅由‘0’~‘9’构成

3.要求:时间复杂度O(n)

二、解题思路

1.从字符字符串的结尾开始到0,

2.将两个字符串的数值相加,如果超过10,需要进位

三、具体步骤

使用的语言是C

#include 
#include 
#include 

// 计算两个数之和
char* solve(char* s, char* t ) {
    int lens = strlen(s);
    int lent = strlen(t);
    // 保证lens是比较长的
    if (lens < lent) {
        char* tmp = s;
        s = t;
        t = tmp;
        int temp = lens;
        lens = lent;
        lent = temp;
    }
    // 结果字符串最大可能长度是较长输入字符串长度加1(考虑进位)
    char* a = (char*)malloc((lens + 1) * sizeof(char));
    if (a == NULL) {
        printf("内存分配失败\n");
        return NULL;
    }
    int lena = 0;  // 用于记录结果字符串a当前存储的位置索引,从开头往后存储,初始为0
    int carry = 0;
    int i = lens - 1;  // s字符串从末尾往前的索引
    int j = lent - 1;  // t字符串从末尾往前的索引
    while (j >= 0) {
        int sum = (s[i] - '0') + (t[j] - '0') + carry;
        carry = sum / 10;
        a[lena++] = sum % 10 + '0';
        i--;
        j--;
    }
    while (i >= 0) {
        int sum = (s[i] - '0') + carry;
        carry = sum / 10;
        a[lena++] = sum % 10 + '0';
        i--;
    }
    if (carry > 0) {
        a[lena++] = carry + '0';
    }
    a[lena] = '\0';  // 添加字符串结束符

    // 反转结果字符串a,使其顺序正确
    int left = 0;
    int right = lena - 1;
    while (left < right) {
        char temp = a[left];
        a[left] = a[right];
        a[right] = temp;
        left++;
        right--;
    }

    return a;
}

你可能感兴趣的:(面试,职场和发展)