LeetCode 43.字符串相乘

字符串相乘

给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。
注意:不能使用任何内置的 BigInteger 库或直接将输入转换为整数。

方法一、做加法

一图胜前言,主要完成错位相加即可,注意边界情况的处理。此方法非直接将输入转换为整数,但是其中一位会转换为整数,符合题目要求。
在这里插入图片描述

Swift

func multiply(_ num1: String, _ num2: String) -> String {
        if num1 == "0" || num2 == "0" {
            return "0"
        }
        
        var ans = "0"
        let m = num1.count
        let n = num2.count
        
        for i in (0..<n).reversed() {
            var add = 0//进位
            var curr = [Int]()
            
            //补0
            for j in (0..<n).reversed() {
                if j > i {
                    curr.append(0)
                }
            }
            
            let char = num2[num2.index(num2.startIndex, offsetBy: i)]
            let y = Int(String(char))!//乘数的一位
            
            for j in (0..<m).reversed() {
                let char = num1[num1.index(num1.startIndex, offsetBy: j)]
                let x = Int(String(char))!//被乘数的一位
                
                let result = x * y + add;
                curr.append(result % 10)
                add = result / 10
            }
            
            while add != 0 {
                curr.append(add % 10)
                add /= 10
            }
            
            //将两字符串相加
            let result:String = curr.reversed().map { String($0) }.joined()
            ans = addStrings(ans, result)
        }
        
        return ans
    }
    
    func addStrings(_ str1: String, _ str2: String) -> String {
        var i = str1.count - 1, j = str2.count - 1, add = 0
        
        var cur = [Int]()
        while i >= 0 || j >= 0 || add != 0 {
            
            let x = i>=0 ? Int(String(str1[str1.index(str1.startIndex, offsetBy: i)]))! : 0
            let y = j>=0 ? Int(String(str2[str2.index(str2.startIndex, offsetBy: j)]))! : 0
            
            let result = x + y + add
            
            cur.append(result % 10)
            add = result / 10
            
            i -= 1
            j -= 1
        }
        
        let result = cur.reversed().map { String($0) }.joined()
        return result
    }

OC

- (NSString *)multiply:(NSString *)num1 num2:(NSString *)num2 {
    
    if ([num1 isEqualToString:@"0"] || [num2 isEqualToString:@"0"]) {
        return @"0";
    }
    
    NSString *ans = @"";
    NSInteger m = num1.length;
    NSInteger n = num2.length;
    
    for (NSInteger i=n-1; i>=0; i--) {
        NSMutableArray *cur = @[].mutableCopy;
        NSInteger add = 0;//进位
        
        for (NSInteger j=n-1; j>i; j--) {
            [cur addObject:@(0)];
        }
        
        NSInteger x = [num2 characterAtIndex:i] - '0';
        
        for (NSInteger j=m-1; j>=0; j--) {
            NSInteger y = [num1 characterAtIndex:j] - '0';
            
            NSInteger result = x * y + add;
            
            [cur addObject:@(result%10)];
            add = result / 10;
        }
        
        while (add != 0) {
            [cur addObject:@(add%10)];
            add /= 10;
        }
        
        NSMutableString *str2 = @"".mutableCopy;
        [cur enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(NSNumber *obj, NSUInteger idx, BOOL * _Nonnull stop) {
            [str2 appendString:[NSString stringWithFormat:@"%d", [obj intValue]]];
        }];
        
        ans = [self addStrings:ans str2:str2];
    }
    return ans;
}


/// 两个字符串相加
/// - Parameters:
///   - str1: 字符串1
///   - str2: 字符串2
- (NSString *)addStrings:(NSString *)str1 str2:(NSString *)str2 {
    NSMutableArray *ans = @[].mutableCopy;
    NSInteger m = str1.length - 1, n = str2.length - 1, add = 0;
    
    while (m >= 0 || n >= 0 || add != 0) {
        NSInteger x = m >= 0 ? [str1 characterAtIndex:m] - '0' : 0;
        NSInteger y = n >= 0 ? [str2 characterAtIndex:n] - '0' : 0;
        
        NSInteger result = x + y + add;
        [ans addObject:@(result % 10)];
        add = result / 10;
        
        m--;
        n--;
    }
    
    NSMutableString *result = @"".mutableCopy;
    [ans enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(NSNumber *obj, NSUInteger idx, BOOL * _Nonnull stop) {
        [result appendString:[NSString stringWithFormat:@"%d", [obj intValue]]];
    }];
    return result;
}

相关推荐

最近更新

  1. TCP协议是安全的吗?

    2024-03-10 18:00:13       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-10 18:00:13       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-10 18:00:13       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-10 18:00:13       20 阅读

热门阅读

  1. C++核心编程

    2024-03-10 18:00:13       18 阅读
  2. 力扣背包问题

    2024-03-10 18:00:13       23 阅读
  3. 【微软技术】介绍

    2024-03-10 18:00:13       24 阅读
  4. 面试题之——SpringBoot的好处?

    2024-03-10 18:00:13       24 阅读
  5. django 的 filter 使用技巧

    2024-03-10 18:00:13       22 阅读
  6. uniapp中使用LocalStorage实现本地存储缓存数据

    2024-03-10 18:00:13       23 阅读