記事のディレクトリ
415.文字列の追加
class Solution:
def addStrings(self, num1: str, num2: str) -> str:
l1 = len(num1)
l2 = len(num2)
i1 = l1 - 1
i2 = l2 - 1
carry = 0
base = 10
ans = ''
while i1 >= 0 or i2 >= 0 or carry:
a = int(num1[i1]) if i1 >= 0 else 0
b = int(num2[i2]) if i2 >= 0 else 0
sum_ = a + b + carry
ans = ans + str(sum_ % base)
carry = sum_ // base
i1 -= 1
i2 -= 1
return ans[::-1]
文字列の減算
文字列の減算は少し面倒です
まず、比較する必要があります。
次に、次のコードがあります。
#include<bits/stdc++.h>
using namespace std;
int a[101], b[101], c[101];
int main(void) {
int lena, lenb, lenc;
string s1, s2;
cin >> s1 >> s2;
lena = s1.length();
lenb = s2.length();
//将上述字符串以int型数据存入数组
//因为减法是从个位算起,所以存储时到倒着存
for (int i = 1; i <= lena; i++) {
a[i] = s1[lena - i] - '0';//以数字存储
}
for (int j = 1; j <= lenb; j++) {
b[j] = s2[lenb - j] - '0';//以数字存储
}
//开始模拟减法并将数据存入c数组
lenc = lena;
for (int p = 1; p <= lenc; p++) {
//同位相减,不够减时
if (a[p] < b[p]) {
a[p + 1]--;//向高位借1
a[p] += 10;//此时同位加10
}
c[p] = a[p] - b[p];
}
//处理c数组的前导0
while (c[lenc] == 0 && lenc > 1)
lenc--;
//确定好c数组的位数后,就可以倒序输出了
for (int q = lenc; q >= 1; q--) {
cout << c[q];
}
return 0;
}
43.文字列の乗算
時間計算量:O(n×(n + m))O(n \ times(n + m))O (n××(n+m ))
nは2番目の文字列の長さです
class Solution:
def multiply(self, num1, num2):
if num1 == '0' or num2 == '0':
return '0'
ans = '0'
l1, l2 = len(num1), len(num2)
for i in range(l2 - 1, -1, -1):
add = 0
y = int(num2[i])
curr = ['0'] * (l2 - i - 1)
for j in range(l1 - 1, -1, -1):
product = int(num1) * y + add
curr.append(str(product % 10))
add = product // 10
while add:
curr.append(str(add % 10))
add //= 10
curr = "".join(curr[::-1])
ans = self.addString(ans, curr)
return ans
def addString(self, s1, s2):
i = len(s1) - 1
j = len(s2) - 1
carry = 0
ans = []
while i >= 0 or j >= 0 or carry:
x = s1[i] if i >= 0 else 0
y = s2[j] if j >= 0 else 0
i -= 1
j -= 1
sum_ = x + y + carry
carry = sum_ // 10
ans.append(str(sum_ % 10))
return "".join(ans)[::-1]