leetcode刷题笔记四十三 字符串相乘

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
posted @ 2020-06-29 22:39  ganshuoos  阅读(147)  评论(0编辑  收藏  举报