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

发布时间 2023-09-11 13:31:32作者: zz子木zz

242. 有效的字母异位词

mydemo--(成功)--(学了卡哥的思路)

class Solution {
public:
    bool isAnagram(string s, string t) {
        
        int alphabet = 26;
        int hash[alphabet]; 
        for(int i=0; i<alphabet; i++)
        {
            hash[i] = 0;
        }

        //for(int i=0; i<(s.length()-1); i++)   //字符串末尾 /0
        for(int i=0; i<(s.length()); i++)
        {
            hash[s[i]-'a']++;
        }

        //for(int i=0; i<(t.length()-1); i++)
        for(int i=0; i<(t.length()); i++)
        {
            hash[t[i]-'a']--;
        }

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

        return true;
    }
};

关于

//for(int i=0; i<(s.length()-1); i++)   //字符串末尾 /0
for(int i=0; i<(s.length()); i++)

确实,c++中的string最后有一个/0,但是length()size()并不会包含/0,即

s.length() = s.真实长度 - 1;
s.size() = s.真实长度 - 1;

卡哥demo

lass 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']++;
        }
        for (int i = 0; i < t.size(); i++) {
            record[t[i] - 'a']--;
        }
        for (int i = 0; i < 26; i++) {
            if (record[i] != 0) {
                // record数组如果有的元素不为零0,说明字符串s和t 一定是谁多了字符或者谁少了字符。
                return false;
            }
        }
        // record数组所有元素都为零0,说明字符串s和t是字母异位词
        return true;
    }
};

349.两个数组的交集

mydemo-(自己的思路)-(错误)

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        
        vector<int> result;
        //int hash1[hashsize] = {0};
        //int hash2[hashsize] = {0};
        //int hash2[hashsize] = {0};
        int hash1[10] = {0};
        int hash2[10] = {0};

        for(int i=0; i<nums1.size(); i++)
        {
            hash1[nums1[i]-0]++;
        }

        for(int i=0; i<nums2.size(); i++ )
        {
            hash2[nums2[i]-0]++;
        }

        for(int i=0; i<10; i++)
        {
            if(hash1[i] == hash2[i] && hash1[i]!=0)
                result.push_back(i);
        }

        return result;
    }
};

错误原因:

if(hash1[i] == hash2[i] && hash1[i]!=0)

考虑以下例子:【1,2,3】,【1,2,2,2,3,4,5】。在哈希表1中,2有1个;在哈希表2中,2有3个,所以不满足hash1[i] == hash2[i]

正确写法:

if(hash1[i]!=0 && hash2[i]!@=0)

mydemoV2-(自己的思路)-(成功)

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        
        vector<int> result;
        //int hashsize= 1000;
        //int hash1[hashsize] = {0};
        //int hash2[hashsize] = {0};
        int hash1[1000] = {0};
        int hash2[1000] = {0};

        for(int i=0; i<nums1.size(); i++)
        {
            hash1[nums1[i]-0]++;
        }

        cout << "hash1:" <<endl;
        for(int i=0; i<10; i++)
        {
            cout << hash1[i] << " ";
        }
        cout << endl;

        for(int i=0; i<nums2.size(); i++ )
        {
            hash2[nums2[i]-0]++;
        }

        cout << "hash2:" <<endl;
        for(int i=0; i<10; i++)
        {
            cout << hash2[i] << " ";
        }

        for(int i=0; i<1000; i++)
        {
            if(hash1[i]!=0 && hash2[i]!=0)
                result.push_back(i);
        }

        return result;
    }
};

时间复杂度 O(n)

空间复杂度 O(1)

关于

//int hashssize = 1000;
//int hash1[hashsize] = {0};
//int hash2[hashsize] = {0};

报错,使用变量定义长度时,不可在定义时同时进行初始化赋值,需要在之后进行赋值

mydemoV3-(卡哥思路)-(成功)

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        
        vector<int> result;
        int hash1[1000] = {0};

        for(int i=0; i<nums1.size(); i++)
        {
            hash1[nums1[i]-0]++;
        }

        cout << "hash1:" <<endl;
        for(int i=0; i<10; i++)
        {
            cout << hash1[i] << " ";
        }
        cout << endl;

        for(int i=0; i<nums2.size(); i++ )
        {
            if(hash1[nums2[i]] != 0)
            {
                result.push_back(nums2[i]);
                hash1[nums2[i]] = 0;
            }   
        }

        return result;
    }
};

卡哥代码

关于 unorderd_set的语法的博客:https://www.cnblogs.com/JCpeng/p/15227986.html

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        
        unordered_set<int> result_set;
        unordered_set<int> nums_set(nums1.begin(), nums1.end());

        for(int num : nums2){
            if(nums_set.find(num) != nums_set.end())
            {
                result_set.insert(num);
            }
        }

        return vector<int>(result_set.begin(), result_set.end());

    }
};

202.快乐数

卡哥代码

(取位运算不熟)

class Solution {
public:

    int getSum(int n)
    {
        int sum=0;
        while(n)
        {
            sum = sum + (n%10) * (n%10);
            n /= 10;
        }
        return sum;
    }

    bool isHappy(int n) {
        
        unordered_set<int> result;
        while(1)
        {
            int sum = getSum(n);
            
            if(sum==1) return true;
            else
            {
                if(result.find(sum) != result.end()) //找到了相同值 
                    return false;
                else
                    result.insert(sum);
            }
            
            n = sum;
        }
    }
};

1. 两数之和

卡哥代码

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        unordered_map<int,int> map;
        for(int i =0; i<nums.size(); i++)
        {
            auto iter = map.find(target - nums[i]);
            if(iter != map.end())  //如果找到了
            {
                return {iter->second, i};
            }

            //没找到,则把当前遍历的值和索引hash到map中
            map.insert(pair<int, int>(nums[i],i));
        }
        return {};
    }
}

{ }

{ }表示容器vector就是容器

https://www.cnblogs.com/linuxAndMcu/p/10254542.html

auto

auto可以在声明变量时根据变量初始值的类型自动匹配类型

auto f = 3.14;  //double
auto s("hello");  //const char*
auto z = new auto(9);  //int *
auto x1 = 5, x2 = 5.0, x3 = 'r';   //错误,必须是初始化为同一类型

pair

将2个数据组合成一组数据