今日练习题:交替合并字符串
题目:给你两个字符串 word1 和 word2 。请你从 word1 开始,通过交替添加字母来合并字符串。如果一个字符串比另一个字符串长,就将多出来的字母追加到合并后字符串的末尾。
返回 合并后的字符串 。
练习语言:JavaScript
第一个写法:运行时间55ms
const mergeAlternately = function (word1, word2) {
let str = ''
let length = word1.length > word2.length ? word2.length : word1.length
for (let i = 0; i < length; i++) {
str += word1[i]
str += word2[i]
}
str += word1.slice(length)
str += word2.slice(length)
// str = str.concat(word1.slice(length))
// str = str.concat(word2.substring(length))
}
在写这段代码的过程中用到了对字符串的截取和字符串的拼接。
截取:
- slice(): 字符串.slice(开始下标, 结束下标) - 结束下标可不传
- substr(): 字符串.substr(开始下标, 截取长度)
- substring(): 字符串.substring(开始下标,结束下标) - 返回被截取的字符串,不包含结束下标对应的字符,结束下标可不传
拼接:
- 通过
+符号将两个字符串连接在一起:'Hello'+'World' - 使用模版字符串(``),在其中嵌入表达式: '
${str1}${str2}' - concat() :
arr1.concat(arr2,arr3)或者str1.concat(str2)该方法返回的是一个浅拷贝,可以连接数组,对象,字符串。MDN上强烈建议使用赋值操作符(+,+=)代替concat方法 - 赋值操作符(
+,+=):str1 += str2 - 数组的join():
arr.jion(分隔符),相应的还有toString()和toLocalString()。对象转字符串有一些方法,其中有一个JSON.stringify(obj)
第二个写法: 运行时间52ms
const mergeAlternately = function (word1, word2) {
const res = [];
const len = word2.length < word1.length ? word1.length : word2.length;
for (let i = 0; i < len; i++) {
word1[i] ? res.push(word1[i], word2[i]) : res.push(word2[i]);
}
return res.join('');
}
这一段代码是看的别人的写法,主要的区别在于循环语句里面的处理。且无需再对剩余的字符写额外的语句。
因为自己在做的时候尝试过使用push(),只是后面在输出push以后的数组时发现,当某个字符串取完了以后,会push一个undefined到数组里面去占位,因为不了解当使用join()的时候会把数组里面的undefined剔除掉,于是放弃了。
包括在第一个写法里面使用+=赋值操作符的时候,如果str的初始值不是空字符串,而是undeined,+=会将undefined转换为字符串拼接起来。
解题思路其实很简单,但是实际在下手写代码的时候会发现,对于数组和字符串的一些使用方法其实掌握的还不到位,脑袋里面有想法以后要实现得靠去百度,比如字符串的截取方式、拼接方式具体有哪些,具体参数应该怎么传,如果是在工作中其实无形的就拉低了写代码的效率。以前自己一直觉得思维很重要,但是其实把想法实现出来同样重要。
附:看一下java的官解,熟悉java语言