242.有效的字母异位词
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
示例 1: 输入: s = "anagram", t = "nagaram" 输出: true
示例 2: 输入: s = "rat", t = "car" 输出: false
说明: 你可以假设字符串只包含小写字母。
function isAnagram(s: string, t: string): boolean {
let strArr1: string[] = Array.from(s)
let strArr2: string[] = Array.from(t)
strArr1.sort()
strArr2.sort()
if(strArr2.join('') == strArr1.join(''))
return true
else
return false
};
笔者个人写法,擅用数组和字符串的内置方法。
/**
* @param {string} s
* @param {string} t
* @return {boolean}
*/
var isAnagram = function(s, t) {
if(s.length !== t.length) return false;
const resSet = new Array(26).fill(0);
const base = "a".charCodeAt();
for(const i of s) {
resSet[i.charCodeAt() - base]++;
}
for(const i of t) {
if(!resSet[i.charCodeAt() - base]) return false;
resSet[i.charCodeAt() - base]--;
}
return true;
};
代码随想录原文解法,charCodeAt能获取每个字母字符对应的Unicode值,由于它是连续的,所以可以作为数组索引下标来使用。
349. 两个数组的交集
题意:给定两个数组,编写一个函数来计算它们的交集。
说明: 输出结果中的每个元素一定是唯一的。 我们可以不考虑输出结果的顺序。
var intersection = function (nums1, nums2) {
let set1 = new Set(nums1)
let set2 = Array.from(new Set(nums2))
let result = []
for (let i = 0; i < set2.length; i++) {
if (set1.has(set2[i])) {
result.push(set2[i])
}
}
return result
};
};
笔者方法一 使用Set的特性 去重之后利用Set.has方法来进行交集判断。
let result = nums1.concat(nums2)
result = Array.from(new Set(result))
let final = []
for (let i = 0; i < result.length; i++) {
if (nums1.includes(result[i]) && nums2.includes(result[i]))
final.push(result[i])
}
return final
笔者方法二 使用includes判断交集
var arr1=[1,2,3,4,5,6,"a","b"]
var arr2=['a','b',1,2]
var arr3=arr1.filter(item=>{
return arr2.includes(item)
})
console.log(arr3);//[ 1, 2, 'a', 'b' ]
//filter()数组的过滤方法,会返回满足条件的元素组成一个新数组
//includes()方法如果在数组中查到该元素则返回true否则返回false
利用api取数组交集的最简便办法。
第202题. 快乐数
编写一个算法来判断一个数 n 是不是快乐数。
「快乐数」定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。如果 可以变为 1,那么这个数就是快乐数。
如果 n 是快乐数就返回 True ;不是,则返回 False 。
示例:
输入:19
输出:true
解释:
1^2 + 9^2 = 82
8^2 + 2^2 = 68
6^2 + 8^2 = 100
1^2 + 0^2 + 0^2 = 1
var isHappy = function (n) {
let set = new Set()
let sum
while (sum !== 1) {
//这一步这样处理是因为一开始sum是undefined
let arr = ('' + (sum || n)).split('')
sum = arr.reduce((prev, cur) => {
return prev + cur ** 2
}, 0)
if (set.has(sum)) {
return false
}
set.add(sum)
}
return true
};
笔者代码 利用set的特性判断,reduce求和
以下是代码随想录的JavaScript解法
var isHappy = function (n) {
let m = new Map()
const getSum = (num) => {
let sum = 0
while (n) {
sum += (n % 10) ** 2
n = Math.floor(n / 10)
}
return sum
}
while (true) {
// n出现过,证明已陷入无限循环
if (m.has(n)) return false
if (n === 1) return true
m.set(n, 1)
n = getSum(n)
}
}
// 方法二:使用环形链表的思想 说明出现闭环 退出循环
var isHappy = function(n) {
if (getN(n) == 1) return true;
let a = getN(n), b = getN(getN(n));
// 如果 a === b
while (b !== 1 && getN(b) !== 1 && a !== b) {
a = getN(a);
b = getN(getN(b));
}
return b === 1 || getN(b) === 1 ;
};
// 方法三:使用Set()更简洁
/**
* @param {number} n
* @return {boolean}
*/
var getSum = function (n) {
let sum = 0;
while (n) {
sum += (n % 10) ** 2;
n = Math.floor(n/10);
}
return sum;
}
var isHappy = function(n) {
let set = new Set(); // Set() 里的数是惟一的
// 如果在循环中某个值重复出现,说明此时陷入死循环,也就说明这个值不是快乐数
while (n !== 1 && !set.has(n)) {
set.add(n);
n = getSum(n);
}
return n === 1;
};
// 方法四:使用Set(),求和用reduce
var isHappy = function(n) {
let set = new Set();
let totalCount;
while(totalCount !== 1) {
let arr = (''+(totalCount || n)).split('');
totalCount = arr.reduce((total, num) => {
return total + num * num
}, 0)
if (set.has(totalCount)) {
return false;
}
set.add(totalCount);
}
return true;
};