题目出自LeetCodehttps://leetcode-cn.com

有效的字母异位词

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

示例 1:
输入: s = "anagram", t = "nagaram"
输出: true
示例 2:
输入: s = "rat", t = "car"
输出: false

  • 按照字典序排序,比较是否相等
  • 数数字出现的次数 用一个哈希表 最后比较这两个哈希表是否相同

第一种

 /**
 * @param {string} s
 * @param {string} t
 * @return {boolean}
 */
var isAnagram = function(s, t) {
   let sArr = s.split('').sort().join('')
   let tArr = t.split('').sort().join('')
   return sArr == tArr
};

两数之和

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

示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

  • 暴力两重循环
var twoSum = function(nums, target) {
    for(var i = 0;i<nums.length;i++){
        for(var j = 0;j<nums.length;j++){
            if(i!==j){
                if(nums[i]+nums[j]==target){
                    var a = [];
                    a.push(i,j);
                    return a;
                }
            }
        }
    }
};
  • 建立一个哈希表 循环一个 x 判断target是否在哈希表中
    const map = {}
     const len = nums.length
     for (let i = 0; i < len; i++) {
         const targetNum = target - nums[i];
         if (targetNum in map) return [map[targetNum], i]
         map[nums[i]] = i
     }
  • 也可以用排序+左右指针 不过哈希表应该是最优解 只有O(n)

    三数之和

    给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。

    例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],
    满足要求的三元组集合为:
    [
    [-1, 0, 1],
    [-1, -1, 2]
    ]

  • 暴力解法三重循环
  • 两重循环 枚举a、b c在hash里面找
  • 先排序 以升序为例 枚举a 如果b、c在剩下的数组里找,b从最左端,c从最右段 如果a+b+c>0 则c向左移,如果a+b+c<0 则b向右移动