Day 5 leetcode 242,349,202,1

242. 有效的字母异位词

题目:
给定两个字符串 st ,编写一个函数来判断 t 是否是 s 的 字母异位词。
示例 1:
输入: s = "anagram", t = "nagaram"
输出: true
示例 2:
输入: s = "rat", t = "car"
输出: false
思路:
比较两个字符串中相同字母出现的频率即可,遍历两个字符串,将第一个字符串的字符个数添加到 hash 表中,遍历第二个字符串的时候,从 hash 表中删除对应的字符,最后判断 hash 表是否为 0 ,如果为 0 则说明两个字符串是字母异位词,不为 0 则不是。

var isAnagram = function(s, t) {
	let hash = new Array(26).fill(0) // 只需要考虑小写字母
	for(let i = 0; i < s.length; i++){
		hash[s.charCodeAt(i) - 'a'.charCodeAt(0)]++ // 这步是进行ASCII码的计算,假设s中有个字符是b,它的ASCII码 - a的ASCII码 = 1,所以它就存在了hash表索引为1的位置。
	}
	for(let i = 0; i < t.length; i++){
		hash[t.charCodeAt(i) - 'a'.charCodeAt(0)]--
	}
	return hash.every((item) => (item ===0))
}

349. 两个数组的交集

题目:
给定两个数组 nums1nums2 ,返回 它们的 交集。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序
示例 1:
输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2]
示例 2:
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[9,4]
思路:
hash 表用Set()
判断 nums 2 中的元素是否在 nums 1 中出现过,并且返回的不能是重复的数据,最好的方法就是使用 Set(),因为 Set() 是自动去重的,先通过将 nums 1 数组传入 Set(),生成一个 Set() 集合,在通过 .has() 方法判断 nums 2 中的元素是否在集合中,如果在,则通过 .add() 方法传入 result 集合中,由于最后输出的是数组,需要将 result 集合转换成数组,通过 Array.from() 方法。

var intersection = function(nums1, nums2) {
	let hash = new Set(nums1)
	let result = new Set()
	for(let i = 0; i < nums2.length; i++){
		if(hash.has(nums2[i])){
			result.add(nums2[i])
		}
	}
	return Array.from(result)
}

hash 表用数组
由于题目限定,先构建一个长度大于 1000 的数组,并通过遍历将 nums 1 的元素全部储存到数组的对应位置,再通过遍历 nums 2,判断 nums 2 的元素是否在 nums 1 中,如果对应位置已经有了元素,则将该元素储存到 result 集合中,并通过 Array.from() 方法转换为数组。

var intersection = function(nums1, nums2) {
	let hash = new Array(1005).fill(0)
	let result = new Set()
	for(let i = 0; i < nums1.length; i++){
		hash[nums1[i]] = 1
	}
	for(let i = 0; i < nums2.length; i++){
		if(hash[nums2[i] === 1){
			result.add(nums2[i])
		}
	}
	return Array.from(result)
}

202. 快乐数

题目:
编写一个算法来判断一个数 n 是不是快乐数。
「快乐数」 定义为:

  • 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
  • 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
  • 如果这个过程 结果为 1,那么这个数就是快乐数。
    如果 n快乐数 就返回 true ;不是,则返回 false
    示例 1:
    输入:n = 19
    输出:true
    示例 2:
    输入:n = 2
    输出:false
    思路:
    主要是判断计算结果是否是 1,如果发生循环,则就不是快乐数,发生循环说明计算结果出现的相同的数字,通过比对之前的数,发现现在的数已经出现过,所以使用哈希表,并且使用 Set() 防止重复的情况。
function sum(n){
	let sum = 0
	while(n > 0){
		let sqrt = n % 10
		sum += sqrt * sqrt
		n = Math.floor(n / 10)
	}
	return sum
}
var isHappy = function(n) {
	let hash = new Set()
	while(n !== 1){
		if(hash.get(n)){
			return false
		}
		hash.add(n)
		n = sum(n)
	}
	return true
}

1. 两数之和

题目:
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。
你可以按任意顺序返回答案。
示例 1:
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
示例 2:
输入:nums = [3,2,4], target = 6
输出:[1,2]
示例 3:
输入:nums = [3,3], target = 6
输出:[0,1]
思路:
暴力法
两次循环遍历所有的结果

var twoSum = function (nums, target) {
    let res = 0
    for(let i = 0;i <= nums.length - 1;i++){
        for(let j = i + 1; j <= nums.length - 1;j++){
            if(nums[i] + nums[j]===target){
                return [i,j]
            }
        }
    }
};

哈希表
要考虑为什么用哈希表,为什么用 Map()。因为是其实是判断是否遍历过某一个元素,也就是该元素是否出现在集合中,这个时候就可以使用 hash 表。Map() 在这题的作用是用来存储遍历过的元素的值和在数组中的下标,以此来返回结果。

var twoSum = function (nums, target) {
	let hash = new Map()
	for(let i = 0; i < nums.length; i++){
		if(hash.has(target - nums[i])){
			return [hash.get(target - nums[i]), i]
		}
		hash.set(nums[i], i)
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值