12
12
13
13
class MultiplyStrings {
14
14
func multiply( _ num1: String , _ num2: String ) -> String {
15
- guard num1 != " 0 " && num2 != " 0 " else {
16
- return " 0 "
17
- }
18
-
19
- let num1Chars = Array ( num1. characters. reversed ( ) )
20
- let num2Chars = Array ( num2. characters. reversed ( ) )
21
- var res = Array ( repeating: 0 , count: num1Chars. count + num2Chars. count)
22
- var finalChars = [ String] ( ) , carry = 0 , sum = 0
15
+ let num1 = num1. reversed ( ) , num2 = num2. reversed ( )
16
+ var res = Array ( repeating: 0 , count: num1. count + num2. count) , resStr = " "
23
17
24
- for (i, char1) in num1Chars. enumerated ( ) {
25
- let n1 = Int ( String ( char1) )
26
- for (j, char2) in num2Chars. enumerated ( ) {
27
- res [ i + j] += n1! * Int( String ( char2) ) !
18
+ // calculate product for every digit
19
+ for (i, char1) in num1. enumerated ( ) {
20
+
21
+ guard let digit1 = Int ( String ( char1) ) else {
22
+ fatalError ( " Invalid Input num1 " )
23
+ }
24
+
25
+ for (j, char2) in num2. enumerated ( ) {
26
+ guard let digit2 = Int ( String ( char2) ) else {
27
+ fatalError ( " Invalid Input num2 " )
28
+ }
29
+
30
+ res [ i + j] += digit1 * digit2
28
31
}
29
32
}
30
33
31
- for num in res {
32
- sum = ( carry + num) % 10
33
- carry = ( carry + num) / 10
34
- finalChars. insert ( String ( sum) , at: 0 )
34
+ // update digits
35
+ for i in 0 ..< res. count {
36
+ let num = res [ i]
37
+
38
+ res [ i] = num % 10
39
+ if i < res. count - 1 {
40
+ res [ i + 1 ] += num / 10
41
+ }
42
+
43
+ resStr = " \( res [ i] ) " + resStr
35
44
}
36
45
37
- while !finalChars. isEmpty && finalChars. first! == " 0 " {
38
- finalChars. removeFirst ( )
46
+ // trim starting 0s
47
+ while !resStr. isEmpty && resStr. first! == " 0 " {
48
+ resStr. removeFirst ( )
39
49
}
40
50
41
- return finalChars . reduce ( " " ) { $0 + $1 }
51
+ return resStr . isEmpty ? " 0 " : resStr
42
52
}
43
- }
53
+ }
0 commit comments