01力扣(简单题)

105 阅读3分钟

今日练习题:交替合并字符串

题目:给你两个字符串 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))
}

在写这段代码的过程中用到了对字符串的截取字符串的拼接

截取:

  1. slice(): 字符串.slice(开始下标, 结束下标) - 结束下标可不传
  2. substr(): 字符串.substr(开始下标, 截取长度)
  3. substring(): 字符串.substring(开始下标,结束下标) - 返回被截取的字符串,不包含结束下标对应的字符,结束下标可不传

拼接:

  1. 通过+符号将两个字符串连接在一起:'Hello'+'World'
  2. 使用模版字符串(``),在其中嵌入表达式: '${str1}${str2}'
  3. concat() : arr1.concat(arr2,arr3)或者str1.concat(str2)该方法返回的是一个浅拷贝,可以连接数组,对象,字符串。MDN上强烈建议使用赋值操作符++=)代替 concat 方法
  4. 赋值操作符(++=str1 += str2
  5. 数组的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语言

image.png