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 协议 ,转载请注明出处!