小言_互联网的博客

【力扣笔记43】字符串相乘

205人阅读  评论(0)

题目

给定两个以字符串形式表示的非负整数 num1num2,返回 num1num2 的乘积,它们的乘积也表示为字符串形式。

示例 1:

输入: num1 = "2", num2 = "3"
输出: "6"

示例 2:

输入: num1 = "123", num2 = "456"
输出: "56088"

说明:

  1. num1num2 的长度小于110。
  2. num1num2 只包含数字 0-9
  3. num1num2 均不以零开头,除非是数字 0 本身。
  4. 不能使用任何标准库的大数类型(比如 BigInteger)直接将输入转换为整数来处理

解法1(正确)

思想

模拟手工计算的方法,例如:

问题是如何将“369”“246”“123”对应到正确的位置,可以使用添加零的方式,在切片中存储“963”“0642”“00321”,然后逐位相加即可,有进位的地方存储至prepAdd,最后将三个切片相加,为了使计算简便,将切片补长至最长的切片,例如“96300”“06420”“00321”,相加之后得到的结果为“92151”,再将其翻转即可。

golang代码

func multiply(num1 string, num2 string) string {
   
	//若某个数为0,则直接输出为0
	if num1 == "0" || num2 == "0" {
   
		return "0"
	}

	b1 := []byte(num1)
	b2 := []byte(num2)
	temp := [][]byte(nil)
	result := make([]byte, 0)

	for i := 0; i <= len(b2)-1; i++ {
   
		prepAdd := 0
		temp = append(temp, []byte{
   })
		//添加0
		for k := 0; k < len(b2)-1-i; k++ {
   
			temp[i] = append(temp[i], '0')
		}

		for j := len(b1) - 1; j >= 0; j-- {
   
			current := int((b2[i]-'0')*(b1[j]-'0')+byte(prepAdd)) % 10
			prepAdd = int((b2[i]-'0')*(b1[j]-'0')+byte(prepAdd)) / 10
			temp[i] = append(temp[i], byte(current)+'0')
		}
        //检测是否还有进位
		for prepAdd != 0 {
   
			current := int(byte(prepAdd)) % 10
			prepAdd = int(byte(prepAdd)) / 10
			temp[i] = append(temp[i], byte(current)+'0')
		}
        //将切片补齐至长度一样
		for len(temp[i]) < len(temp[0]) {
   
			temp[i] = append(temp[i], '0')
		}
	}

	//求和计算结果
	prepAdd := 0
	value := 0
	for i := 0; i < len(temp[0]); i++ {
   
		for j := 0; j < len(temp); j++ {
   
			value += int(temp[j][i] - '0')
		}
		current := (value + prepAdd) % 10
		prepAdd = (value + prepAdd) / 10
		result = append(result, byte(current)+'0')
		value = 0
	}
	//如果存在进位
	for prepAdd != 0 {
   
		current := int(byte(prepAdd)) % 10
		prepAdd = int(byte(prepAdd)) / 10
		result = append(result, byte(current)+'0')
	}

	//将结果切片反转
	for i, j := 0, len(result)-1; i < j; i, j = i+1, j-1 {
   
		result[i], result[j] = result[j], result[i]
	}
	return string(result)
}

结果

执行结果:通过

执行用时:4 ms, 在所有 Go 提交中击败了74.74%的用户

内存消耗:4.4 MB, 在所有 Go 提交中击败了29.65%的用户

官方解答

https://leetcode-cn.com/problems/multiply-strings/solution/zi-fu-chuan-xiang-cheng-by-leetcode-solution/


转载:https://blog.csdn.net/bestzy6/article/details/117112804
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场