• 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
    
  • 相关阅读:
    收藏网站制作常用经典css.div.布局.设计实例打包下载2
    下拉菜单 效果
    鼠标放在一个连接上,会显示图片(类似tooltip)
    收藏网站制作常用经典ajax.prototype.javascript实例打包下载2
    开发速查手册
    Visual Studio 2005 的 101 个示例(转)
    多行文本框限制输入字符长度(跳出窗体提示)
    发一个不用图片实现圆角代码,非常经典
    收藏网站制作常用经典css.div.布局.设计实例打包下载1
    Linux下php动态添加扩展
  • 原文地址:https://www.cnblogs.com/ganshuoos/p/13210853.html
Copyright © 2020-2023  润新知