leetcode刷题笔记四十三 字符串相乘
源地址:43. 字符串相乘
问题描述:
给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。
示例 1:
输入: num1 = "2", num2 = "3"
输出: "6"
示例 2:输入: num1 = "123", num2 = "456"
输出: "56088"
说明:1.num1 和 num2 的长度小于110。
2.num1 和 num2 只包含数字 0-9。
3.num1 和 num2 均不以零开头,除非是数字 0 本身。
4.不能使用任何标准库的大数类型(比如 BigInteger)或直接将输入转换为整数来处理。
代码补充:
//将字符串的相乘,通过乘数与被乘数单一字符的计算累加完成
//举例而言, num1 = "10" , num2 = "1"
// i = 1 , j = 0时, num1(i) = 0 num2(j) = 1
// res(i+j+1) = 1 res(i+j) = 0 以此类推处理
import scala.collection.mutable
object Solution {
def multiply(num1: String, num2: String): String = {
if (num1 == "0" || num2 == "0") return "0"
val num1Length = num1.length
val num2Length = num2.length
val ansArr = Array.fill(num1Length+num2Length)(0)
for(i <- (0 to num1Length-1).reverse;j <- (0 to num2Length-1).reverse){
//由于每一位上直接进行累加,要防止其大于10
val num = (num1(i).toInt - 48) * (num2(j).toInt - 48) + ansArr(i+j+1)
ansArr(i+j+1) = num % 10
ansArr(i+j) += num / 10
}
//使用dropWhile去除Arr头部的0
return ansArr.dropWhile(_ == 0).mkString
}
}
//引申 字符串加法
//由于字符串加法可以利用同样的位处理的方式,通过单一变量i控制位置
//需要先对较短的字符串的前部补0
//而后处理方式基本相似
import scala.collection.mutable
import scala.math
object test {
def main(args: Array[String]): Unit = {
def plusply(num1:String, num2:String):Unit = {
if (num1 == "0" || num2 == "0") return "0"
var num1Length = num1.length
val num2Length = num2.length
val ansArr = Array.fill[Int](math.max(num1Length,num2Length)+1)(0)
var num1Str = num1
var num2Str = num2
var diff = 0
if (num1Length < num2Length){
val tempStr = num2
num2Str = num1
num1Str = tempStr
diff = num2Length - num1Length
num1Length = num2Length
}
var str = ""
for (i <- 0 until diff){
str += "0"
}
num2Str = str + num2Str
//println(num2Str)
for (i <- (0 to num1Length-1)){
val num = (num1Str(i).toInt - 48) + (num2Str(i).toInt - 48) + ansArr(i+1)
ansArr(i+1) = num % 10
ansArr(i) += num / 10
}
println("num1: " + num1)
println("num2: " + num2)
println(" ans: " + ansArr.dropWhile(_ == 0).mkString)
}
plusply("1", "1010")
}
}
//执行结果:
//num1: 1
//num2: 1010
// ans: 1011