Leet code 1768 交替合并字符串(简单)

143 阅读2分钟

题目:给你两个字符串 word1 和 word2 。请你从 word1 开始,通过交替添加字母来合并字符串。如果一个字符串比另一个字符串长,就将多出来的字母追加到合并后字符串的末尾。 返回 合并后的字符串 。 来源:力扣(LeetCode) 链接:leetcode.cn/problems/me… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

第一次提交:

var mergeAlternately = function(word1, word2) {    let newString = '';    if (word1.length === word2.length) {        for(let i=0; i<word1.length; i++) {            newString = newString.concat(word1[i]).concat(word2[i]);        }    }    else if (word1.length !== word2.length) {        if (word1.length > word2.length) {            for(let i=0; i<word2.length; i++) {                newString = newString.concat(word1[i]).concat(word2[i]);            }            const moreString = word1.slice(word2.length);            newString = newString.concat(moreString);        }        else {            for(let i=0; i<word1.length; i++) {                newString = newString.concat(word1[i]).concat(word2[i]);            }            const moreString = word2.slice(word1.length);            newString = newString.concat(moreString);        }    }    return newString;};

有几个明显的缺点:

1.既然会用到两个字符串的长度进行判断,那么应该在最开始定为常量;

2.if else 的写法过于啰嗦,而且重复内容较多,可读性较差;

3.字符串方法有限,没有想到先暂存到数组中再转为字符串的方式

官方解题方法采用了双指针:

var mergeAlternately = function(word1, word2) {    const l1 = word1.length;    const l2 = word2.length;    let arr = [];    let i = 0, j = 0;    while (i < l1 || j < l2) {        if (i < l1) {            arr.push(word1[i]);            i++;        }        if (j < l2) {            arr.push(word2[j]);            j++;        }    }    return arr.join('');};

复杂度分析

todo: 掌握如何判断复杂度。

时间复杂度: O ( m + n ) O(m+n),其中 m m 和 n n 分别是字符串 word 1 word 1 ​ 和 word 2 word 2 ​ 的长度。 

空间复杂度: O ( 1 ) O(1) 或 O ( m + n ) O(m+n)。如果使用的语言支持可修改的字符串,那么空间复杂度为 O ( 1 ) O(1),否则为 O ( m + n ) O(m+n)。注意这里不计入返回值需要的空间 。

但是看评论中有一些单指针的写法,似乎也是可以的。

var mergeAlternately = function(word1, word2) {    const l1 = word1.length, l2 = word2.length;    const arr = [];    let i = 0;    while (i < l1 || i < l2) {        if (i < l1) {            arr.push(word1[i]);        }        if (i < l2) {            arr.push(word2[i]);        }        i++;    }    return arr.join('');};

和双指针区别不大,只是少了一个变量写的更简洁一些

总结:整体的解题思路就是以指针的形式遍历两个字符串的每一个字母,对于js来说的关键点其实是考虑到先用数组存值,再转换为字符串。