前端刷题路-Day7

吐槽君 分类:javascript

有效的字母异位词(题号242)

题目

给定两个字符串 st ,编写一个函数来判断 t 是否是 s 的字母异位词。

示例 1:

输入: s = "anagram", t = "nagaram"
输出: true
 

示例 2:

输入: s = "rat", t = "car"
输出: false
 

说明:
你可以假设字符串只包含小写字母。

进阶:
如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况?

链接

leetcode-cn.com/problems/va…

解释

这题本来只想到了用Map或者对象来进行操作,想法比较简单,这里不多做赘述。那么剩下的一种方法就是给两个字符串进行排序,之后比较排序结果是否相等就好,这种方法比较简单,但是性能不好,并不推荐。

自己的答案(对象)

var isAnagram = function(s, t) {
  var obj = new Map()
  var sArr = s.split('')
  var tArr = t.split('')
  if (sArr.length !== tArr.length) return false
  for (let index = 0; index < sArr.length; index++) {
    const item = sArr[index];
    if (!obj.has(item)) {
      obj.set(item, 1)
    } else {
      obj.set(item, obj.get(item) + 1)
    }
  }
  for (let index = 0; index < tArr.length; index++) {
    const item = tArr[index];
    if (!obj.has(item)) {
      return false
    } else {
      var value = obj.get(item)
      switch (value) {
        case 0:
          return false
        case 1:
          obj.delete(item)
          break    
        default:
          obj.set(item, obj.get(item) - 1)
          break
      }      
    }
  }
  if (obj.size === 0)return true
  return false
};
 

这里用对象或者Map都可以,性能上都细微差异

自己的答案(排序两次)

var isAnagram = function(s, t) {
  return s.split('').sort().join('') === t.split('').sort().join('')
};
 

这就没啥可以说都,一行代码搞定,用toString()也可以都。

更好都答案

var isAnagram = function(s, t) {
    return s.length === t.length && Array.from(Array.from(s).reduce((h, v, i) => (h.set(v, (h.get(v) || 0) + 1), h.set(t[i], (h.get(t[i]) || 0) - 1), h), new Map).values()).every(v => !v)
};

 

这里就是用了reduce,看上去高档一些

两数之和(题号1)

题目

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。

你可以按任意顺序返回答案。

示例 1:

输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
 

示例 2:

输入:nums = [3,2,4], target = 6
输出:[1,2]
 

示例 3:

输入:nums = [3,3], target = 6
输出:[0,1]
 

提示:

  • 2 <= nums.length <= 103
  • -109 <= nums[i] <= 109
  • -109 <= target <= 109
  • 只会存在一个有效答案

链接

leetcode-cn.com/problems/tw…

解释

这没啥可解释都,看代码即可

自己的答案

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[]}
 */
var twoSum = function(nums, target) {
  var obj = new Map()
  for (let index = 0; index < nums.length; index++) {
    var item = nums[index];
    if (obj.has(item)) {
      return [obj.get(item), index]
    }
    obj.set(target - item, index)
  }
};
 

PS:想查看往期文章和题目可以点击下面的链接:

这里是按照日期分类的?

前端刷题路-目录(日期分类)

经过有些朋友的提醒,感觉也应该按照题型分类
这里是按照题型分类的?

前端刷题路-目录(题型分类)

有兴趣的也可以看看我的个人主页?

Here is RZ

回复

我来回复
  • 暂无回复内容