代码随想录训练营第五天| LeetCode 242. 有效字母的异位词、 LeetCode 349. 两个数字的交集、LeetCode 202. 快乐数、LeetCode 1. 两数之和

LeetCode 242. 有效字母的异位词

解题思路

        本题是要统计两个字符串出现的每个字母数量是否都相同。 由于字母只有26个,可以选择用数组做存储。因为字符a到字符z的ASC|| 是 26个连续的值, 所以字符a映射为下标0, 相应的字符z映射为下标25

        

代码解析

class Solution {
public:
    bool isAnagram(string s, string t) {

        if(s.size() != t.size())
        return false;

        int table[26] = {0};

        for(int i = 0; i<s.size(); i++)
        {
            int temp = s[i] - 'a';
            int temp1 = t[i] - 'a';
            table[temp]++;
            table[temp1]--;
            
        }

        for(int i=0; i<26; i++)
        {
            if(table[i] !=0)
            return false;
        }

        return true;
        

        

    }
};

LeetCode 349. 两个数组的交集

解题思路

        输出结果中的每个元素一定是唯一的,也就是说输出的结果要去重。如果简单的用暴力法进行遍历,要是nums2中出现重复值,就没法排除。

        如果哈希值比较少、特别分散、跨度非常大,使用数组就造成空间极大的浪费。unordered_set 的 读写效率是最高的,并不需要对数据进行排序,而且可以让数据不重复。

        这里需要掌握unordered_set 与vector 转化的方法。

unordered_set<int> result_set;

// 插值
result_set.insert(1);

// 转化为vector
vector<int>(result.begin(), result.end());

代码解析

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {

        unordered_set<int> result_set; // 存放结果,之所以用set是为了给结果集去重
        unordered_set<int> nums_set(nums1.begin(), nums1.end());
        for (int num : nums2) {
            // 发现nums2的元素 在nums_set里又出现过
            if (nums_set.find(num) != nums_set.end()) {
                result_set.insert(num);
            }
        }
        return vector<int>(result_set.begin(), result_set.end());
    
    

    }
};

LeetCode 202. 快乐数

解题思路

        快乐数是指:将正整数上的每个位置上的数字进行平方求和,如果这个数不是1,就重复上述操作直到这个数变成1。如果陷入无限循环,则说明这个不是快乐数。

        该题的第一个核心是要完成平方求和的操作,就是利用整除10 以及整除10取余操作。

        第二个要抓住“无限循环”这一关键点,如果出现之前的数 说明再循环也不会出现1了,那就可以直接退出该循环。所以在循环过程中要将这些中间值进行记录。

代码解析

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

LeetCode 1. 两数之和

解题思路

        本题不仅要知道元素有没有遍历过,还要知道这个元素对应的下标,需要使用key value 结构

来存放,key存放元素,value存放下标。这个就可以使用map(感觉可以类比python 里的字典)。

        map的一些标准用法如下:

// 初始化map
unordered_map <int, int> map;

// 在map中寻找是否有匹配的key
// 注意返回的是指针(key, value)结构
auto iter = map.find('key');

// 访问指针结构中的value值
iter->second;

// 访问指针结构中的key值
iter->first;

// map中插入元素(1,2)
map.insert(pair<int, int>(1,2));

代码解析

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        std::unordered_map <int,int> map;
        for(int i = 0; i < nums.size(); i++) {
            // 遍历当前元素,并在map中寻找是否有匹配的key
            auto iter = map.find(target - nums[i]); 
            if(iter != map.end()) {
                return {iter->second, i};
            }
            // 如果没找到匹配对,就把访问过的元素和下标加入到map中
            map.insert(pair<int, int>(nums[i], i)); 
        }
        return {};
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值