题目:给你两个字符串 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来说的关键点其实是考虑到先用数组存值,再转换为字符串。