代码随想录算法训练营Day5 242.有效的字母异位词 349. 两个数组的交集 202. 快乐数 1. 两数之和

本文介绍了四个编程问题的解决方案:判断字母异位词的方法利用数组存储字符值,查找两个数组交集通过集合去重并查找,快乐数通过计算平方和判断,以及两数之和使用双指针技巧。
摘要由CSDN通过智能技术生成

目录

242.有效的字母异位词

349. 两个数组的交集

202. 快乐数

1. 两数之和


242.有效的字母异位词

思路:利用数组进行存储,最重要的是s[i] - 'a',把下标控制在0-25里面了,一个字符串负责把里面的字符进行加值,另一个字符串进行减值,然后如果这个两个字符串是异位词就说明我们建的数组肯定是空的。

class Solution {
public:
    bool isAnagram(string s, string t) {
        int arr[26] = {0};//设置数组

        //减a以后刚好和从a到z一一对应0到25
        for(int i = 0; i < s.length(); i++){//把字符串s遍历一遍
            arr[s[i] - 'a']++;//如果有进去的就++,因为字符串只有小写字母,因此arr的范围是0到25,刚刚好
        }

        for(int j = 0; j < t.length(); j++){
            arr[t[j] - 'a']--;//如果t字符串里面有符合的就--
        }

        //如果两个是异位词那么int数组肯定为0,不等0就说明不是异位词,因为值都会给减回去
        for(int k = 0; k < 26; k++){
            if(arr[k] != 0){
                return false;
            }
        }

        return true;
    }
};

349. 两个数组的交集

思路:我们先把两个vector集合放进set里面去掉重复元素(可能时间会慢一点),然后循环s1集合,s2用find集合来找有没有对应的值,如果有就说明这个值是交集元素

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        //使用set容器,把重复元素删了
        unordered_set<int> s1;
        unordered_set<int> s2;
        vector<int> vector;
    
        //把值赋给set容器里面,可以去重复值,缩短时间
        for(int i = 0; i < nums1.size(); i++){
            s1.insert(nums1[i]);
        }
        for(int i = 0; i < nums2.size(); i++){
            s2.insert(nums2[i]);
        }

        //迭代器遍历,如果s1里面的值可以在s2里面用find找到就说明是交集元素,加到vector里面
        for(unordered_set<int>::iterator it = s1.begin(); it != s1.end(); it++){
             if(s2.find(*it) != s2.end()){
                 vector.push_back(*it);
             }
        }

        return vector;

202. 快乐数

我们写一个单独的计算平方和的函数(怎么求出个位数是关键),然后在isHappy调用,如果得到的值等于1,就说明这个数是快乐数,如果不等于1,就把他插到我们的set集合里面(用哈希表查某个数快),后面如果在集合里面再出现了就说明陷入无限循环了。

class Solution {
public:
    int getNum(int n){
        int sum = 0;//等到n然后拆开平方加起来之后,拿用来记录加起来的值然后返回
        while(n){//如果被除干净了等于0就退出
            sum += (n % 10) * (n % 10);//得到个位然后平方
            n = n / 10;
        }
        return sum;
    }

    bool isHappy(int n) {
        unordered_set<int> s;//用来记录平方过的值,如果有出现过就说明要无限循环了

        while(true){
            int num = getNum(n);//接收平方值

            if(num == 1){//如果等于1,就返回
                return true;
            }

            if(s.find(num) == s.end()){//如果没在集合里面,就加进去
                s.insert(num);
            }else{//如果出现了,就返回fasle
                return false;
            }
            n = num;
        }

    }
}

1. 两数之和

使用双指针,慢指针在后,快指针快速遍历一圈看慢,快指针下标的值之和有没有等于target,没有就让慢指针++,快指针重新到慢指针的前一位,但是因为是两个循环速度慢一些。

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        vector<int> v;//定义一个vector集合
        int slow = 0;
        int fast = 0;

        //慢指针的值必须小于target,不然fast肯定大于0,只会越加越大
        while(slow < nums.size()){
            for(fast = slow + 1; fast < nums.size(); fast++){
                if(nums[fast] + nums[slow] == target){//如果等于就记录这两个下标
                    v.push_back(slow);
                    v.push_back(fast);
                    break;
                }
            }
            slow++;
        }
        return v;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值