Day Two

繼昨天的問題,更換思路,使用鏈表邊遍歷邊相加的思路。
首先在不考慮進(jìn)位的情況下,完成邊遍歷邊相加的功能。其次再考慮進(jìn)位的情況。

/**
 * 
 * @param {ListNode} l1 
 * @param {ListNode} l2 
 * return {ListNode}
 */
var addTwoNumbers  = (l1, l2) => {
    // 創(chuàng)建頭指針
    let result = new ListNode(null);
    let head = result;
    // 遍歷鏈表,同時(shí)遍歷l1,l2
    while (l1 != null || l2 != null) {
        let temp1 = l1 != null ? l1.val : 0;
        let temp2 = l2 != null ? l2.val : 0;
        // 創(chuàng)建子節(jié)點(diǎn)
        head.next = new ListNode(temp1 + temp2);
        // 移動頭指針
        head = head.next;
        // 移動參數(shù)鏈表指針
        if (l1 != null) {
            l1 = l1.next;
        }
        if (l2 != null) {
            l2 = l2.next;
        }
    }
    return result.next;
};

進(jìn)位的難點(diǎn)其實(shí)在于最高位進(jìn)位時(shí),我們需要再創(chuàng)建一個(gè)子節(jié)點(diǎn)。

/**
 * 
 * @param {ListNode} l1 
 * @param {ListNode} l2 
 * return {ListNode}
 */
var addTwoNumbers  = (l1, l2) => {
    // 創(chuàng)建頭指針
    let result = new ListNode(null);
    let head = result;
    // 進(jìn)位
    let carry = 0;
    while (l1 != null || l2 != null) {
        let temp1 = l1 != null ? l1.val : 0;
        let temp2 = l2 != null ? l2.val : 0;
        // 帶進(jìn)位加
        let sum = temp2 + temp1 + carry;
        // 計(jì)算進(jìn)位
        carry = Math.floor(sum / 10);
        // 創(chuàng)建子節(jié)點(diǎn)
        head.next = new ListNode(sum % 10);
        // 移動頭指針
        head = head.next;
        // 移動參數(shù)鏈表指針
        if (l1 != null) {
            l1 = l1.next;
        }
        if (l2 != null) {
            l2 = l2.next;
        }
    }
    // 如果最高位有進(jìn)位,則需要多創(chuàng)建一個(gè)節(jié)點(diǎn)。
    if (carry > 0) {
        head.next = new ListNode(carry);
    }
    return result.next;
};
image.png

提交結(jié)果也是很滿意。題目一開始就在強(qiáng)調(diào)鏈表操作,本想取巧使用字符串的操作方式(其實(shí)是把鏈表的知識忘沒了),所以還得努力啊。


第三題

無重復(fù)字符的最長子串

Category Difficulty Likes Dislikes
algorithms Medium (32.04%) 2737 -

給定一個(gè)字符串,請你找出其中不含有重復(fù)字符的 最長子串 的長度。
示例 1:

輸入: "abcabcbb"
輸出: 3 
解釋: 因?yàn)闊o重復(fù)字符的最長子串是 "abc",所以其長度為 3。

示例 2:

輸入: "bbbbb"
輸出: 1
解釋: 因?yàn)闊o重復(fù)字符的最長子串是 "b",所以其長度為 1。

示例 3:

輸入: "pwwkew"
輸出: 3
解釋: 因?yàn)闊o重復(fù)字符的最長子串是 "wke",所以其長度為 3。
     請注意,你的答案必須是 子串 的長度,"pwke" 是一個(gè)子序列,不是子串。

思路,遍歷字符串,用中間變量存儲子串,判斷每個(gè)字符是否存在于中間變量中,如果存在,截取字符串。

/**
 * @param {string} s
 * @return {number}
 */
var lengthOfLongestSubstring = function(s) {
    // 字符串長度
    let len = s.length;
    // 子串長度
    let count = 0;
    // 中間字符串
    let tempStr = '';
    for (let i = 0; i < len; i++) {
        if (tempStr.indexOf(s[i]) == -1) {
            // 如果當(dāng)前字符不存在,把字符添加到中間字符串中
            tempStr += s[i];
            // 如果中間字符串長度大于子串長度,更新子串長度
            if (tempStr.length > count) {
                count = tempStr.length;
            }
        } else {
            // 如果當(dāng)前字符存在
            tempStr += s[i];
            // 找到當(dāng)前字符在原字符串中的位置
            let index = tempStr.indexOf(s[i]);
            // 截取原字符串
            tempStr = tempStr.slice(index + 1);
        }
    }
    return count;
};

時(shí)間效率上還是不錯的,但是空間上的占用還是比較的多。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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