ch3_2字母异位词&& ch3_3 两个数组的交集

lc242 字母异位词

1.

关键点的思想: 哈希映射思想,

  1. 使用了数组的下标代表了 对应的字符,
  2. 使用下标位置中的保存数值, 代表了该字符出现的次数了;

具体讲来:
根据字母与 字母a 算差值, 将该差值映射到数组的下标位置上, 并将该位置上的数值加一, 代表该字母出现一次了;

实现步骤:

  1. 如果两个字符串长度不等, 直接返回 false;

  2. 将每个字符减去字符 “a”, 他们相减时,便是对应到0~25 这二十六个字母;

  3. 使用一个大小为 26 的数组record, 初始值默认为0,

  4. 先遍历一个字符串,每个字符减去字符 “a”, 每一次相减时得到 diff ,对应到 record中下标为diff 的位置上,数值加一, 从而代表该字符出现一次;

  5. 然后,遍历另一字符串, 每个字符减去字符 “a”, 每一次相减时得到 diff ,对应到 record中下标为diff 的位置上,数值 减一, 从而代表了该字符在该串中出现了,
    每次减一之后, 判断该位置上的数值 是否 小于 零,
    小于零, 代表该字符在 前一个串中,没有出现过,返回false;

class Solution {
public:
    bool isAnagram(string s, string t) {
            if (s.length() !=  t.length() ){
            return false;
        }

        int record[26]  = {0};// 数组的初始化

        for(int i = 0; i < s.length(); i++){
            int diff =  s[i] - 'a' ;
            record[diff]++;
            printf("%d", record[diff]);
        }

        for(int i = 0; i< t.length();  i++){
            int diff = t[i] - 'a';
            record[diff]--;
            printf("%d", record[diff]);
            if (record[diff]  < 0){return false;}

            
        }
        return true;

    }
};

lc349

2. 链表中相交集合

2.1 unordered_set 集合中各种方法

c++中 使用unordered_set , 定义集合,

unordered_set<int> nums_set;

  1. 当两个集合中的元素类型相同时, 可以使用
    nums_set.insert(num1_set.begin(), num1_set.end() )
    将num1_set 中的元素,全部添加到 nums_set 集合中;

在元素的输出上, 可以使用遍历器(又称迭代器)进行输出控制。

vector<int> b(a.begin(), a.begin()+3):
这种声明形式中, (a.begin()、a.begin()+3) 表示向量起始元素位置到起始元素+3之间的元素位置。

(a.begin(), a.end()):
则表示, 包含起始元素到最后一个元素 的所有元素。

向量元素的位置便成为遍历器, 同时, 向量元素的位置也是一种数据类型, 在向量中遍历器的类型为:
vector<int>::iterator

遍历器不但表示元素位置, 还可以再容器中前后移动。

在上例中讲元素全部输出部分的代码就可以改写为:
    //全部输出
    vector<int>::iterator t ;
    for(t=a.begin(); t!=a.end(); t++)
        cout<<*t<<" " ;
*t 为指针的间接访问形式, 意思是访问t所指向的元素值。
  1. set1.find(a) 判读集合中是否有a 元素,
    若果有,返回该元素;
    如果没有则返回 set1.end()

2.2 解题步骤

  1. 利用 unordered_set 集合自身的属性, 是无顺序且没有重复元素的特点,

调用vector 自身的 begin, end 方法, 将nums1数组中的元素 存入到集合1中;

  1. 遍历数组nums2, 将其中的与集合1中重复的元素存入到, result 集合中;
    使用集合中的 find 方法 查找是否存在元素, 存在就将元素插入到result 集合中 ;

  2. 返回result 集合中的所有元素;

#include "vector"
#include "unordered_set"

using namespace std;

class  Solution{
public:
    vector<int>  intersection(vector<int>& nums1, vector<int>& nums2){
       // unorder_set 是一个容器, 其中的元素是无顺序, 无重复;
       // 新建一个 result 集合;
       unordered_set<int> result;
       // 将数组1 中的元素, 存放到新建集合中去;
       unordered_set<int> nums1_set(nums1.begin(), nums1.end());

       //  遍历数组2 中的元素, 将与 集合1中 重复的元素,存入到 result 集合中;
       //  判断集合1中有无 数组2中的元素, 使用的是集合的. find 方法 与 集合.end() 搭配使用;
       for(int i = 0; i < nums2.size(); i++){
           if(nums1_set.find(nums2[i]) != nums1_set.end() ) {
               // 如果find() 返回的不是 .end(),  表明查找到,该元素;且返回的也是该元素;
               result.insert(nums2[i]);
           }
       }
        // 重新将集合转化为数组;
        return  vector<int> (result.begin(), result.end());

    }


};


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值