LeetCode 884题 两句话中的不常见单词 -- JavaScript

题目描述:

给定两个句子 A 和 B 。 (句子是一串由空格分隔的单词。每个单词仅由小写字母组成。)

如果一个单词在其中一个句子中只出现一次,在另一个句子中却没有出现,那么这个单词就是不常见的。返回所有不常用单词的列表(数组)。您可以按任何顺序返回列表(数组)。

说明

  1. 0 <= A.length <= 200
  2. 0 <= B.length <= 200
  3. A 和 B 都只包含空格和小写字母。

示例 :

输入:A = "this apple is sweet", B = "this apple is sour"
输出:["sweet","sour"]
输入:A = "apple apple", B = "banana"
输出:["banana"]

方法分析: 

根据定义,不常见单词指的是“在其中一个句子中只出现一次,在另一个句子中没有出现”。也就是说,其同时满足两个条件:

  • 该单词在该句子中出现一次,即不能重复。
  • 该单词在另一个句子中不会出现,即另一个句子中不包含该单词

另外,要得到句子中的所有单词,我们需要将字符串类型的句子转换为通过空格分隔的单词数组。

代码实现:

方法1:完全遵照定义式做法

var uncommonFromSentences = function(A, B) {
  //将两个字符串转换为数组
  let [A2arr, B2arr] = [A.split(" "), B.split(" ")];
  //存放结果的数组
  let result = [];
  //遍历A数组,获得所有在A中不重复且不存在于B中的单词
  for (let i = 0; i < A2arr.length; i++) {
    if(A2arr.indexOf(A2arr[i]) == A2arr.lastIndexOf(A2arr[i]) && !B2arr.includes(A2arr[i])) {
      result.push(A2arr[i]);
    }
  }
  //遍历B数组,获得所有在B中不重复且不存在于A中的单词
  for (let j = 0; j < B2arr.length; j++) {
    if(B2arr.indexOf(B2arr[j]) == B2arr.lastIndexOf(B2arr[j]) && !A2arr.includes(B2arr[j])) {
      result.push(B2arr[j]);
    }
  }
  return result;   
};        

方法2:拼接判断法

var uncommonFromSentences = function(A, B) {
  //将字符串A、B转换为数组
  let [A2arr, B2arr] = [A.split(" "), B.split(" ")];
  //将两个数组进行拼接
  let ABarr = [...A2arr, ...B2arr];
  let result = [];
  //将拼接数组中的未重复项放入结果数组中
  for (let i = 0; i < ABarr.length; i++) {
    if(ABarr.indexOf(ABarr[i]) == ABarr.lastIndexOf(ABarr[i])) {
      result.push(ABarr[i]);
    }
  }
  return result;   
};   

代码解析:

在上述两种方法中,我们首先都将字符串A、B转换为了数组,这也是后续操作的前提。在方法1中,我们严格按照定义来做,分别遍历数组,找出在该数组中只出现一次,在另一个数组中没有出现的单词项,即为不常见单词。在方法2中,我们简化了代码,而是将数组进行了拼接,从而只需要判断在拼接数组中只出现过一次的项,即为不常见单词。

相关链接:https://leetcode-cn.com/problems/uncommon-words-from-two-sentences/description/

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值