【Day6】哈希表、242有效的字母异位词、349两个数组的交集、202快乐数、1两数之和

【Day6】哈希表、242有效的字母异位词、349两个数组的交集、202快乐数、1两数之和

哈希表理论基础

哈希表

哈希表(Hash table),也叫散列表。

一般哈希表都是用来快速判断一个元素是否出现集合里

242 有效的字母异位词

题目连接:242

定义一个数组record,大小为26 ,初始化为0,因为字符a到字符z的ASCII也是26个连续的数值。

class Solution {
    
    
public:
    bool isAnagram(string s, string t) {
    
    
        int record[26] = {
    
    0};
        for (int i = 0; i < s.size(); i++) {
    
    
            // 并不需要记住字符a的ASCII,只要求出一个相对数值就可以了
            record[s[i] - 'a']++;  //a是对应的0下标
        }
        for (int i = 0; i < t.size(); i++) {
    
    
            record[t[i] - 'a']--;  //在s数组里有几个对应的字母就加几个,在t数组里再逐个减掉
        }
        for (int i = 0; i < 26; i++) {
    
    
            if (record[i] != 0) {
    
    
                // record数组如果有的元素不为零0,说明字符串s和t 一定是谁多了字符或者谁少了字符。
                return false;
            }
        }
        // record数组所有元素都为零0,说明字符串s和t是字母异位词
        return true;
    }
};

349 两个数组的交集

题目连接:349

采用unordered_set 可以去重
在这里插入图片描述

class Solution {
    
    
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
    
    
        unordered_set<int> result_set; // 存放结果,之所以用set是为了给结果集去重     unord_set做去重操作
        unordered_set<int> nums_set(nums1.begin(), nums1.end()); //nums1初始化
        for (int num : nums2) {
    
    
            // 发现nums2的元素 在nums_set里又出现过
            if (nums_set.find(num) != nums_set.end()) {
    
    
                result_set.insert(num);//如果2里的元素在1里出现过 放入result 
            }
        }
        return vector<int>(result_set.begin(), result_set.end());
    }   
};

202 快乐数

题目连接:202

class Solution {
    
    
public:
    // 取数值各个位上的单数之和
    int getSum(int n) {
    
    
        int sum = 0;
        while (n) {
    
    
            sum += (n % 10) * (n % 10);
            n /= 10;
        }
        return sum;
    }
    bool isHappy(int n) {
    
    
        unordered_set<int> set;
        while(1) {
    
    
            int sum = getSum(n);
            if (sum == 1) {
    
    
                return true;
            }
            // 如果这个sum曾经出现过,说明已经陷入了无限循环了,立刻return false
            if (set.find(sum) != set.end()) {
    
    
                return false;
            } else {
    
    
                set.insert(sum);
            }
            n = sum;
        }
    }
};

1 两数之和

猜你喜欢

转载自blog.csdn.net/weixin_45768644/article/details/128702976
今日推荐