1768.交替合并字符串
题目
给你两个字符串 word1
和 word2
。请你从 word1
开始,通过交替添加字母来合并字符串。如果一个字符串比另一个字符串长,就将多出来的字母追加到合并后字符串的末尾。
返回 合并后的字符串 。
示例 1:
输入:word1 = "abc", word2 = "pqr" 输出:"apbqcr" 解释:字符串合并情况如下所示: word1: a b c word2: p q r 合并后: a p b q c r
示例 2:
输入:word1 = "ab", word2 = "pqrs" 输出:"apbqrs" 解释:注意,word2 比 word1 长,"rs" 需要追加到合并后字符串的末尾。 word1: a b word2: p q r s 合并后: a p b q r s
示例 3:
输入:word1 = "abcd", word2 = "pq" 输出:"apbqcd" 解释:注意,word1 比 word2 长,"cd" 需要追加到合并后字符串的末尾。 word1: a b c d word2: p q 合并后: a p b q c d
提示:
1 <= word1.length, word2.length <= 100
word1
和word2
由小写英文字母组成
解题思路
只要将字符串中的每个元素都取出来(类似于数组取元素),然后再进行相加即可。需要分为两次,第一次是两个字符串都没比较完时;第二次是有一个字符串比较完成,为空,这时候只要把另一个字符串直接加到后面即可。
相关知识点
字符串可以看成数组,每个字符对应数组中的一个元素,这样就可以进行字符相加的操作
代码
/**
* @param {string} word1
* @param {string} word2
* @return {string}
*/
var mergeAlternately = function(word1, word2) {
let i=0,j=0;
let connection = '';
//交替合并
while(i<word1.length&&j<word2.length){
connection+=word1[i++];
connection+=word2[j++];
}
while (i < word1.length || j < word2.length)
{
if (i < word1.length) { connection += word1[i++]; }
if (j < word2.length) { connection += word2[j++]; }
}
// //如果word1还有字符,追加到结果尾部
// while(i<word1.length){
// connection+=word1[i++];
// }
// //如果word2还有字符,追加到结果尾部
// while(j<word2.length){
// connection+=word2[j++];
// }
return connection;
};
389.找不同
题目
给定两个字符串 s
和 t
,它们只包含小写字母。
字符串 t
由字符串 s
随机重排,然后在随机位置添加一个字母。
请找出在 t
中被添加的字母。
示例 1:
输入:s = "abcd", t = "abcde" 输出:"e" 解释:'e' 是那个被添加的字母。
示例 2:
输入:s = "", t = "y" 输出:"y"
提示:
0 <= s.length <= 1000
t.length == s.length + 1
s
和t
只包含小写字母
一、使用字符频率计数
解题思路
本质上就是需要比较两个字符串有哪个元素不同,这种类型的题目可以通过统计字符出现的字数去比较。(另外,即使是有多处不同也可以用这种方法)
相关知识点
1.使用 JavaScript 中的 for...of
循环语法来遍历字符串中的每个字符。表现为let char of s(遍历s中的元素)
注意:在 JavaScript 中,for...of
循环的完整语法要求使用 let
(或者 const
)来声明迭代变量。因此,省略 let
或 const
是不允许的。
因此写成for char of s { xxx }是错误的。
正确的语法是:for (let char of s) { xxx}
2.可以通过数组存储这个元素的个数 这样便于比较
代码
var findTheDifference = function(s, t) {
// 使用字符频率计数
const count = {};
// 计算s中每个字符的频率
for (let char of s) {
count[char] = (count[char] || 0) + 1;
}
// 减去t中每个字符的频率
for (let char of t) {
if (!count[char]) {
return char; // 如果字符在s中不存在,那么这就是多出的字符
}
count[char]--;
}
};
二、排序后比较
解题思路
可以对两个字符串进行排序,然后按字符比较。排序后,字符串 s
和 t
除了多出的那个字符外,其他字符应该是一一对应的。所以遇到不想等的字符 一定是那个添加的字符。如果前面s个长度的字符串都相同,那多出来的字符就是那个多余的字符串。
相关知识点
把字符串拆分是s.split(''),排序是sort(),将字符连接起来成字符串是.join(''); 注意是split不是spilt;注意是('')还是();
s.split('').sort().join('')
是一个链式调用,它包含三个不同的字符串方法,每个方法都对字符串 s
执行特定的操作。下面我会逐一解释每个方法的作用:
-
split('')
:split
方法是字符串原型上的一个方法,用于将字符串分割成子字符串数组。- 参数 ‘’(空字符串)告诉
split
方法在每个字符之间分割字符串。 - 结果是
s
中的每个字符都被分离出来,并放入一个数组中。例如,如果s
是 “hello”,那么s.split('')
将返回['h', 'e', 'l', 'l', 'o']
。
-
sort()
:sort
方法是数组原型上的一个方法,用于对数组中的元素进行排序。- 当没有提供比较函数时,
sort
方法将按照每个元素的 Unicode 编码顺序进行排序。 - 在上面的例子中,
['h', 'e', 'l', 'l', 'o'].sort()
将返回['e', 'h', 'l', 'l', 'o']
。注意,数字和字母是按照它们在 Unicode 表中的顺序排序的,而不是按照字典顺序。这就是为什么 ‘e’ 排在 ‘h’ 前面的原因。
-
join('')
:join
方法也是数组原型上的一个方法,用于将数组中的所有元素连接成一个字符串。- 参数 ‘’(空字符串)告诉
join
方法在元素之间不添加任何分隔符。 - 在上面的例子中,
['e', 'h', 'l', 'l', 'o'].join('')
将返回'ehllo'
,这是经过排序后的字符数组重新组合成的字符串。
所以,如果 s
是 “hello”,那么 s.split('').sort().join('')
的最终结果是 'ehllo'
,这是将 “hello” 字符串中的字符按照 Unicode 编码顺序排序后的结果。需要注意的是,sort
方法默认不会区分大小写,并且它对某些字符的排序可能不符合预期的字典顺序。如果需要按照字典顺序排序,你应该提供一个自定义的比较函数给 sort
方法。
代码
/**
* @param {string} s
* @param {string} t
* @return {character}
*/
var findTheDifference = function(s, t) {
const sortedS=s.split('').sort().join('');
const sortedT=t.split('').sort().join('');
for(let i=0;i<sortedS.length;i++){
if(sortedS[i]!==sortedT[i])
return sortedT[i];
}
return sortedT[sortedT.length-1]
};