1. 효과적인 애너그램
주제 설명
문제 해결 아이디어
이 질문은 해시 테이블의 아이디어를 사용하여 해결할 수 있습니다. 단어에는 26개의 문자가 있습니다. 해시 테이블을 나타내기 위해 길이가 26인 배열을 정의할 수 있습니다. 여기서 각 문자와 문자 a의 ASCII 값은 26개 문자의 위치를 나타냅니다. 각 문자는 0이 아닙니다.
var isAnagram = function(s, t) {
const countArr = new Array(26).fill(0)
const zero = 'a'.charCodeAt()
for(let i = 0;i<s.length;i++){
countArr[s[i].charCodeAt() - zero]++
}
for(let i = 0;i<t.length;i++){
countArr[t[i].charCodeAt() - zero] --
}
for(let i = 0;i<countArr.length;i++) {
if(countArr[i]!==0){ // 一定要判断不等于0 之前判断小于0 会漏掉t字符串比s字符串长的情况
return false
}
}
return true
};
2. 두 배열의 교차점
주제 설명
문제 해결 아이디어
이 질문은 해시 테이블을 사용합니다. 첫 번째 주기는 첫 번째 배열에서 각 숫자의 발생 횟수를 세고 두 번째 주기는 각 숫자가 해시 테이블에 나타나는지 여부를 결정합니다. 나타나면 이 숫자를 최종 결과에 넣습니다. array , 최종 결과는 중복 제거가 필요하다는 점에 유의해야 합니다.
var intersection = function(nums1, nums2) {
let set = new Set(nums1)
let res = []
for(let i = 0;i<nums2.length;i++){
if(set.has(nums2[i])){
res.push(nums2[i])
}
}
return [...new Set(res)]
};
3. 해피넘버
주제 설명
문제 해결 아이디어
이 질문의 난이도는 각 숫자의 제곱의 합을 구하는 것이고 나머지는 합이 해시 테이블에 나타났는지 판단하는 것입니다. false를 반환하고 합계가 1이면 true를 반환합니다.
var isHappy = function(n) {
let set = new Set() // 本题只需要存值即可 所以使用Set数据集
while(1) {
let sum = getSum(n)
if(set.has(sum)) {
return false
} else if(sum == 1) {
return true
} else {
set.add(sum)
}
n = sum
}
};
var getSum = function(n) {
let sum = 0;
while(n) {
sum += (n%10)**2 // n % 2 求末位数
n = Math.floor(n/10); // n/10 整除
}
return sum
}
4. 두 숫자의 합
주제 설명
문제 해결 아이디어
이 질문에서 해시 테이블을 사용하는 것은 비교적 간단합니다.이 요소가 나타났는지 여부를 판별하기 위해 요소를 제공해야 합니다.있는 경우 이 요소의 첨자를 반환합니다.
그런 다음 요소가 나타나는지 여부를 결정하기 위해 이 요소를 키로 사용하므로 배열의 요소를 키로 사용하고 키는 값에 해당하며 값은 첨자를 저장하는 데 사용됩니다.
var twoSum = function(nums, target) {
let map = new Map()
for(let i = 0;i<nums.length;i++){
if(map.has(target -nums[i])) {
return [i,map.get(target-nums[i])]
} else {
map.set(nums[i],i)
}
}
};