43. 字符串相乘
字符串相乘
题目描述:
给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。
示例 1:
输入: num1 = “2”, num2 = “3”
输出: “6”
示例 2:
输入: num1 = “123”, num2 = “456”
输出: “56088”
说明:
num1 和 num2 的长度小于110。
num1 和 num2 只包含数字 0-9。
num1 和 num2 均不以零开头,除非是数字 0 本身。
不能使用任何标准库的大数类型(比如 BigInteger)或直接将输入转换为整数来处理。
思路:
很普通的大数相乘,就是golang如果想用【】byte来处理会溢出,记得用数组处理
代码:
func multiply(num1 string, num2 string) string {
if num1[0] == '0' || num2[0] == '0' {
return "0"
}
s1, s2 := []byte(num1), []byte(num2)
s3 := make([]int, len(s1)+len(s2))
//string reverse
for i := 0; i < len(s1)/2; i++ {
s1[i], s1[len(s1)-1-i] = s1[len(s1)-1-i], s1[i]
}
for i := 0; i < len(s2)/2; i++ {
s2[i], s2[len(s2)-1-i] = s2[len(s2)-1-i], s2[i]
}
for i := 0; i < len(s1); i++ {
for j := 0; j < len(s2); j++ {
s3[i+j] += int((s1[i] - '0') * (s2[j] - '0'))
}
}
for i := 0; i < len(s1)+len(s2); i++ {
if s3[i] >= 10 {
s3[i+1] += s3[i] / 10
s3[i] = s3[i] % 10
}
}
i := len(s1) + len(s2) - 1
for s3[i] == 0 {
i--
}
s3 = s3[0 : i+1]
for j := 0; j < len(s3)/2; j++ {
s3[j], s3[len(s3)-1-j] = s3[len(s3)-1-j], s3[j]
}
var tmp []byte
for i = 0; i < len(s3); i++ {
tmp = append(tmp, byte(s3[i])+'0')
}
return string(tmp)
}
代码效率:
执行用时:0 ms, 在所有 Go 提交中击败了100.00%的用户
内存消耗:2.4 MB, 在所有 Go 提交中击败了84.69%的用户
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!