leetcode刷题记录-884. 两句话中的不常见单词

223 阅读1分钟

「这是我参与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);
  }
};

image.png