「这是我参与2022首次更文挑战的第5天,活动详情查看:2022首次更文挑战」
前言
今天的题目为简单,之前哪怕是简单题也经常会忘记考虑某些因素而导致多次提交,这次久违的提交一次就过了。
每日一题
今天的每日一题为 884. 两句话中的不常见单词,难度为简单
-
句子 是一串由空格分隔的单词。每个 单词 仅由小写字母组成。
-
如果某个单词在其中一个句子中恰好出现一次,在另一个句子中却 没有出现 ,那么这个单词就是 不常见的 。
-
给你两个 句子 s1 和 s2 ,返回所有 不常用单词 的列表。返回列表中单词可以按 任意顺序 组织。
示例 1:
输入:s1 = "this apple is sweet", s2 = "this apple is sour"
输出:["sweet","sour"]
示例 2:
输入:s1 = "apple apple", s2 = "banana"
输出:["banana"]
提示:
- 1 <= s1.length, s2.length <= 200
- s1 和 s2 由小写英文字母和空格组成
- s1 和 s2 都不含前导或尾随空格
- s1 和 s2 中的所有单词间均由单个空格分隔
题解
今天的这道题和前天的2047. 句子中的有效单词数很相似,都是需要去遍历一个句子去获取单词,只是一个是去判断单词是否合法,今天是去判断单词是否多次出现。
哈希表
说到判断某样东西是否多次出现,第一想到的就是map表,不存在的元素直接赋值1,然后本题因为只要求是不是多次出现,没要求出现多少次,所以二次出现之后值都可以赋为2。
然后我们可以定义一个数组用来保存合法的word,因为遍历一次第一句句子之后,如果等遍历完第二句句子再来判断是否出现两次稍微麻烦,并且题目有个关键是不管满足条件单词在数组中的顺序,所以我们可以先在这个单词出现一次的时候给他push进我们的答案数组,在出现两次之后就给它移除掉,这里我们就先来定义一个数组的移除方法,关于数组中有一个indexOf方法,它的原理是这样的:
Array.prototype.indexOf = function(val) {
for(var i = 0; i < this.length; i++) {
if(this[i] == val)return i;
}
return -1;
};
如果数组中存在这个数则返回它的下标,不存在则返回-1,所以我们在遍历句子的时候,要移除之前需要用它先来判断数组中是否存在这个word
if (ansArr.indexOf(word) + 1) {
ansArr.remove(word);
}
然后就是我们的移除方法 remove:
Array.prototype.remove = function (val) {
var index = this.indexOf(val);
if (index > -1) {
this.splice(index, 1);
}
};
这样后,我们就只需要遍历两个句子,第一次出现的单词添加进答案数组中,不管在哪个句子中再次出现都直接移除:
/**
* @param {string} s1
* @param {string} s2
* @return {string[]}
*/
var uncommonFromSentences = function (s1, s2) {
const s1Arr = s1.trim().split(/\s+/g);
const s2Arr = s2.trim().split(/\s+/g);
let map = new Map();
let ansArr = [];
for (const word of s1Arr) {
if (!map.has(word)) {
map.set(word, 1);
ansArr.push(word);
} else {
map.set(word, 2);
if (ansArr.indexOf(word) + 1) {
ansArr.remove(word);
}
}
}
for (const word of s2Arr) {
if (!map.has(word)) {
map.set(word, 1);
ansArr.push(word);
} else {
map.set(word, 2);
if (ansArr.indexOf(word) + 1) {
ansArr.remove(word);
}
}
}
return ansArr
};
Array.prototype.remove = function (val) {
var index = this.indexOf(val);
if (index > -1) {
this.splice(index, 1);
}
};