LeetCodeブラッシング日記のハッシュテーブルI

1.効果的なアナグラム

トピックの説明

ここに画像の説明を挿入

問題解決のアイデア

この質問は、ハッシュ テーブルのアイデアを使用して解決できます. あります 26 単語には文字があります. ハッシュ テーブルを表すには、長さ 26 の配列を定義できます, 各文字と文字 a の ASCII 値は 26 文字の位置を表します。2 つのループを使用して、最初に各文字の出現回数をカウントし、2 番目のループで各文字の出現回数を減算し、最後に各文字は 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. 2 つの配列の交点

トピックの説明

ここに画像の説明を挿入

問題解決のアイデア

この質問ではハッシュ テーブルを使用します。最初のサイクルでは、最初の配列内の各数値の出現回数をカウントし、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. 2 つの数値の合計

トピックの説明

ここに画像の説明を挿入

問題解決のアイデア

この質問でハッシュテーブルを使うのは比較的簡単です. この要素が出現したかどうかを判断する要素を与える必要があります. 出現していれば, この要素の添え字を返します.
次に、要素が出現するかどうかを判断するために、この要素がキーとして使用されるため、配列内の要素がキーとして使用され、キーは値に対応し、値は添え字を格納するために使用されます。

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)
      }
  }
};

おすすめ

転載: blog.csdn.net/Salange1/article/details/128294604