【iOS每日算法】兩數(shù)相加,給出兩個(gè)非空的鏈表用來表示兩個(gè)非負(fù)的整數(shù)。其中,它們各自的位數(shù)是按照逆序的方式存儲(chǔ)的,并且它們的每個(gè)節(jié)點(diǎn)只能存儲(chǔ)一位數(shù)字。

題目:

給出兩個(gè) 非空 的鏈表用來表示兩個(gè)非負(fù)的整數(shù)。其中,它們各自的位數(shù)是按照 逆序 的方式存儲(chǔ)的,并且它們的每個(gè)節(jié)點(diǎn)只能存儲(chǔ) 一位 數(shù)字。
如果,我們將這兩個(gè)數(shù)相加起來,則會(huì)返回一個(gè)新的鏈表來表示它們的和。
您可以假設(shè)除了數(shù)字 0 之外,這兩個(gè)數(shù)都不會(huì)以 0 開頭。

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/add-two-numbers
著作權(quán)歸領(lǐng)扣網(wǎng)絡(luò)所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系官方授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。

考察點(diǎn):

  • 這是一道LeetCode上非?;A(chǔ)的一道算法題。個(gè)人覺得考察點(diǎn)就是,用盡量小的時(shí)間復(fù)雜度去解題。因?yàn)槿绻婚_始思路是先把鏈表中的數(shù)轉(zhuǎn)成兩個(gè)整數(shù)再sum,之后再放進(jìn)鏈表里也是一個(gè)思路,但這樣會(huì)循環(huán)兩遍鏈表。但因?yàn)閮蓚€(gè)鏈表中的個(gè)位,十位百位都是一致的,所以一次循環(huán),各位相加進(jìn)位,并放入鏈表就可以解決問題。這樣就少做兩次循環(huán),是更優(yōu)解法。

解法:

一、循環(huán)兩個(gè)鏈表對(duì)應(yīng)各位,并相加
  • 這里鏈表用數(shù)組表示,理解算法思路即可

- (NSArray *)sumNum:(NSArray<NSNumber *>*)numArr1 withNum2:(NSArray<NSNumber *>*)numArr2 {
    NSInteger len1 = numArr1.count;
    NSInteger len2 = numArr2.count;
    NSMutableArray *totalArr = [NSMutableArray array];
    for(int i = 0; (i < len1 || i < len2); i++) {
        int sumNum = (i < len1 ? [numArr1[i] intValue] : 0) + (i < len2 ? [numArr2[i] intValue] : 0) + (i < totalArr.count ? [totalArr[i] intValue] : 0);
        if(sumNum < 10) {
            totalArr[i] = @(sumNum);
        } else {
            totalArr[i] = @(sumNum % 10);
            totalArr[i + 1] = @(1);
        }
    }
    return totalArr;
}


二、先算出兩數(shù)之和,然后放入數(shù)組
  • 這個(gè)解法比上一個(gè)復(fù)雜,但是更容易想到,畢竟直接相加兩個(gè)數(shù),要比各位數(shù)相加進(jìn)位要容易。但實(shí)際上多進(jìn)行了兩次循環(huán)。
- (NSArray *)twoSumNum:(NSArray<NSNumber *>*)numArr1 withNum2:(NSArray<NSNumber *>*)numArr2 {
    int num1 = 0;
    int num2 = 0;
    for (int i = 0; i < numArr1.count; i++) {
        num1 = num1 + [numArr1[i] intValue] * pow(10, i);
    }
    for (int i = 0; i < numArr2.count; i++) {
        num2 = num2 + [numArr2[i] intValue] * pow(10, i);
    }
    int totalNum = num1 + num2;
    NSMutableArray *totalArr = [NSMutableArray array];
    for(int i = 0;;i++) {
        int num = (totalNum % [@(pow(10, i + 1)) intValue]) / [@(pow(10, i)) intValue];
        int yushu = totalNum / [@(pow(10, i + 1)) intValue];
        totalArr[i] = @(num);
        if(yushu <= 0) {
            return totalArr;
        }
    }
}

總結(jié)

  • 從這道題中我們可以學(xué)到如何更好的利用數(shù)據(jù)和數(shù)據(jù)的結(jié)構(gòu),而不是簡單的去處理問題,更好的算法和思路能為程序節(jié)省很多資源,提升效率。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容