zoukankan      html  css  js  c++  java
  • [Swift]LeetCode43. 字符串相乘 | Multiply Strings

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
    ➤微信公众号:山青咏芝(shanqingyongzhi)
    ➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/
    ➤GitHub地址:https://github.com/strengthen/LeetCode
    ➤原文地址:https://www.cnblogs.com/strengthen/p/9907355.html 
    ➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
    ➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

    Given two non-negative integers num1 and num2 represented as strings, return the product of num1and num2, also represented as a string.

    Example 1:

    Input: num1 = "2", num2 = "3"
    Output: "6"

    Example 2:

    Input: num1 = "123", num2 = "456"
    Output: "56088"
    

    Note:

    1. The length of both num1 and num2 is < 110.
    2. Both num1 and num2 contain only digits 0-9.
    3. Both num1 and num2 do not contain any leading zero, except the number 0 itself.
    4. You must not use any built-in BigInteger library or convert the inputs to integer directly.

    给定两个以字符串形式表示的非负整数 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)或直接将输入转换为整数来处理。

    56ms

     1 class Solution {
     2   func integerArray(text: String) -> [Int] {
     3     let characterArray = Array(text)
     4     var integerArray = [Int]()
     5     for character in characterArray {
     6       let unitScalar = character.unicodeScalars.first!.value - Unicode.Scalar("0")!.value
     7       integerArray.append(Int(unitScalar))
     8     }
     9 
    10     return integerArray
    11   }
    12 
    13 
    14   func multiply(_ num1: String, _ num2: String) -> String {
    15     if num1 == "0" || num2 == "0" {
    16         return "0"
    17     }
    18     let num1Array = integerArray(text: num1)
    19     let num2Array = integerArray(text: num2)
    20     let maxCount = num1Array.count + num2Array.count - 1
    21     var productArray = [Int](repeating: 0, count: maxCount)
    22     var i = 0
    23     for number1 in num1Array {
    24       var j = i
    25       for number2 in num2Array {
    26         productArray[j] += number1 * number2
    27         j += 1
    28       }
    29       i += 1
    30     }
    31 
    32     var characterArray = [Character]()
    33     let lastIndex = productArray.count - 1
    34     var carry = 0
    35     for k in 0...lastIndex {
    36       let l = lastIndex - k
    37       var value = productArray[l] + carry
    38       if value >= 10 {
    39         carry = value / 10
    40         value = value % 10
    41       } else {
    42         carry = 0
    43       }
    44 
    45       let character: Character = Character(String(value))
    46       characterArray.insert(character, at: 0)
    47     }
    48     if carry > 0 {
    49       let character: Character = Character(String(carry))
    50       characterArray.insert(character, at: 0)
    51     }
    52 
    53     return String(characterArray)
    54   }
    55 }

    72ms

     1 class Solution {
     2     func multiply(_ num1: String, _ num2: String) -> String {
     3         if num1 == "0" || num2 == "0" {
     4             return "0"
     5         }
     6         
     7         var result = String()
     8         
     9         var num1Arr = Array(num1), num2Arr = Array(num2)
    10         let n1 = num1.count, n2 = num2.count
    11         var k = n1 + n2 - 2, carry = 0
    12         var v = [Int](repeating: 0, count: n1 + n2)
    13         let zeroValue = Int("0".unicodeScalars.first!.value)
    14         for i in 0..<n1 {
    15             for j in 0..<n2 {
    16                 let num1Value = Int(num1Arr[i].unicodeScalars.first!.value)
    17                 let num2Value = Int(num2Arr[j].unicodeScalars.first!.value)
    18                 v[k - i - j] += (num1Value - zeroValue) * (num2Value - zeroValue)
    19             }
    20         }
    21         
    22         for i in 0..<n1 + n2 {
    23             v[i] += carry
    24             carry = v[i] / 10
    25             v[i] %= 10
    26         }
    27         var i = n1 + n2 - 1
    28         while v[i] == 0 {
    29             i -= 1
    30         }
    31         if i < 0 {
    32             return "0"
    33         }
    34         while i >= 0 {
    35             let c = Character(UnicodeScalar(zeroValue + v[i])!)
    36             result.append(String(c))
    37             i -= 1
    38         }
    39         
    40         return result
    41     }
    42 }

    88ms

     1 class Solution {
     2     func multiply(_ num1: String, _ num2: String) -> String {
     3         let left = num1.map({ Int(String($0))! })
     4         let right = num2.map({ Int(String($0))! })
     5 
     6         let m = left.count
     7         let n = right.count
     8         var result = [Int](repeating: 0, count: m + n)
     9 
    10         for i in (0..<m).reversed() {
    11             for j in (0..<n).reversed() {
    12                 let mul = left[i] * right[j]
    13                 let pos1 = i + j
    14                 let pos2 = i + j + 1
    15                 let sum = mul + result[pos2]
    16 
    17                 result[pos1] += sum / 10
    18                 result[pos2] = sum % 10
    19             }
    20         }
    21 
    22         var answer = ""
    23         for i in result {
    24             if answer.count == 0 && i == 0 {
    25                 continue
    26             }
    27 
    28             answer += "(i)"
    29         }
    30         
    31         if answer.count == 0 {
    32             return "0"
    33         }
    34 
    35         return answer
    36     }
    37 }

    100ms

     1 class Solution {
     2     func multiply(_ num1: String, _ num2: String) -> String {
     3         let num1Array = Array(num1).map {Int(String($0))}
     4         let num2Array = Array(num2).map {Int(String($0))}
     5         var ansArray = Array(repeatElement(0,count:num1Array.count+num2Array.count))
     6         var step = 0
     7         for index1 in stride(from:num1Array.count-1, through:0, by:-1) {
     8             for index2 in stride(from:num2Array.count-1, through:0, by:-1) {
     9                 let value = num1Array[index1]! * num2Array[index2]!
    10                 ansArray[step+num2Array.count-1-index2] = ansArray[step+num2Array.count-1-index2] + value
    11                 var carrier = ansArray[step+num2Array.count-1-index2] / 10
    12                 ansArray[step+num2Array.count-1-index2] = ansArray[step+num2Array.count-1-index2] - (carrier*10)
    13                 ansArray[step+num2Array.count-1-index2+1] = ansArray[step+num2Array.count-1-index2+1] + carrier
    14             }
    15             step = step + 1
    16         }
    17         
    18         ansArray.reverse()
    19         var lastNonZeroIndex = 0
    20         for value in ansArray {
    21             if value==0 {
    22                 lastNonZeroIndex = lastNonZeroIndex + 1
    23             } else {
    24                 break
    25             }
    26         }
    27 
    28         for count in stride(from:lastNonZeroIndex, to:0, by:-1) {
    29             ansArray.removeFirst()
    30         }
    31 
    32         if ansArray.count == 0 {
    33             return "0"
    34         }
    35         return (ansArray.map {String($0)}).joined(separator: "")
    36     }
    37 }

    168ms

     1 class Solution {
     2     
     3     private let charToInt : [Character : Int] = 
     4     [
     5         "0" : 0, "1" : 1, "2" : 2, "3" : 3, "4" : 4,
     6         "5" : 5, "6" : 6, "7" : 7, "8" : 8, "9" : 9
     7     ]
     8     
     9     func multiply(_ num1: String, _ num2: String) -> String {
    10         let chars1 = Array(num1.characters)
    11         let chars2 = Array(num2.characters)
    12         
    13         var num1Count = num1.count - 1
    14         var num2Count = num2.count - 1
    15         var multiply = 0
    16         let size = num2.count + num1.count
    17         var result = [Int](repeating: 0, count: size)
    18         
    19         for i in stride(from: num1Count, to: -1, by: -1) {
    20             for j in stride(from: num2Count, to: -1, by: -1) {
    21                 var n1 = i >= 0 ? charToInt[chars1[i]] : 0
    22                 var n2 = j >= 0 ? charToInt[chars2[j]] : 0
    23 
    24                 let pos1 = i+j+1
    25                 let pos2 = i+j
    26                 multiply = n1! * n2! + result[pos1]
    27                 
    28                 result[pos1] =  multiply%10
    29                 result[pos2] = result[pos2] + (multiply/10)
    30             }
    31         }
    32 
    33         var resultString = ""
    34         var removeZero = false
    35         for num in result {
    36             if num != 0 {
    37                 removeZero = true
    38             }
    39             if removeZero {
    40                 resultString = resultString + String(num)
    41             }
    42         }
    43         if resultString == "" {
    44             return "0"
    45         }
    46         
    47         return resultString
    48 
    49     }
    50 }

    228ms

     1 class Solution {
     2     func multiply(_ num1: String, _ num2: String) -> String {
     3         let m = num1.count
     4         let n = num2.count
     5         let zero = Character("0").ascii
     6         var pos = [Int](repeating: 0, count: m + n)
     7         var res = [String]()
     8 
     9         for i in (0..<m).reversed() {
    10             for j in (0..<n).reversed() {
    11                 let mul = (num1[i].ascii - zero) * (num2[j].ascii - zero)
    12                 let p1 = i + j
    13                 let p2 = i + j + 1
    14                 let sum = mul + pos[p2]
    15                 pos[p1] += sum / 10
    16                 pos[p2] = sum % 10
    17             }
    18         }
    19 
    20         for p in pos {
    21             if !(res.count == 0 && p == 0) {
    22                 res.append(String(p))
    23             }
    24         }
    25 
    26         return res.count == 0 ? "0" : res.joined()
    27     }
    28 }
    29 
    30 extension Character {
    31     var ascii: Int {
    32         get {
    33             let s = String(self).unicodeScalars
    34             return Int(s[s.startIndex].value)
    35         }
    36     }
    37     
    38     func isDigit() -> Bool {
    39         return self >= "0" && self <= "9"
    40     }
    41 }
    42 
    43 extension String {
    44     subscript (i: Int) -> Character {
    45         return self[index(startIndex, offsetBy: i)]
    46     }
    47 }
  • 相关阅读:
    .net实现支付宝在线支付
    彻头彻尾理解单例模式与多线程
    Linq中的Select与Select many
    MVC中子页面如何引用模板页中的jquery脚本
    浅谈MemCahe
    左连接,右连接,内连接(left join ,right join,inner join)
    协变与逆变
    子类对父类中的属性和字段的改写
    里氏转换
    MVC基础篇—控制器与视图数据的传递
  • 原文地址:https://www.cnblogs.com/strengthen/p/9907355.html
Copyright © 2011-2022 走看看