代码随想录算法【Day5\Day6】

news2025/1/3 2:12:07

DAY5\Day6

1.熟悉哈希表的数据结构:数组、map和set,使用方法、使用场景

2.哈希表应用场景:解决给你一个元素,判断它在集合里是否出现过。

242.有效的字母异位词

本题用数组解决的。

class Solution {
public:
    bool isAnagram(string s, string t) {
        //通过ascii码表将26个字母映射到数组record
        int record[26] = {0};
        for(int i = 0; i < s.size(); i++){
            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) return false;
        }
        return true;
    }
};

有关类型转换,当char类型进行算术运算时,会发生如下转换:

  1. 在算术运算之前,char类型会被自动提升(promoted)为int类型

  2. 这种转换叫做"整型提升"(integral promotion)

  3. 所以两个char相减的结果直接就是int类型不需要再进行类型转换了

349. 两个数组的交集

什么时候用set?1.数值很大;2.数值分布很散

若数值的大小上亿,数组无法解决且浪费空间,这种情况适合用set。

本题数组最大为1000,但是我们按照数值上亿的情况,也就是用set来做。

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)
        for(int i = 0; i < nums2.size(); i++)
        {   
            int num = nums2[i];
            if(nums_set.find(num) != nums_set.end()){
                result_set.insert(num);
            }
        }
        return vector<int>(result_set.begin(), result_set.end());
    }
};

1.for(int num : nums2)的含义

遍历nums2中的数,并赋值给num

2.if(nums_set.find(num) != nums_set.end())的含义。

nums_set.end()是最后一个元素后面的位置,如果nums_set.find()没有找到num,就会返回nums_set.end()。

所以这个判断语句的意思是:if(nums_set中存在num)

3.return vector<int>(result_set.begin(), result_set.end()); 这里是一个强制类型转换吗

不是,是在调用 vector 的一个构造函数。这是 vector 类的一个特殊构造函数,它可以接收两个迭代器作为参数,然后创建一个新的 vector,包含这两个迭代器之间的所有元素。

这行代码做了以下事情:

  1. 创建一个新的 vector<int> 对象

  2. 使用 result_set 的开始迭代器(begin())和结束迭代器(end())

  3. 将 result_set 中的所有元素复制到这个新的 vector 中

202.快乐数

直接法:报错超时

class Solution {
public:
    bool isHappy(int n) {
        int res; //记录平方和
        int tmp;
        while(n > 3){
            res = 0;
            while(n){
                tmp = n%10;
                n /= 10;
                res = res + tmp * tmp;
            }
            if(res == 1) return true;
            n = res;
        }
        if(n == 1) return true;
        return false;
    }
};

题目描述:“也可能是 无限循环 但始终变不到 1”,直接法没有解决这个情况,所以发生了超时

那么如何判断发生了无限循环?

无限循环,那么也就是说求和的过程中,sum会重复出现。使用哈希法,来判断这个sum是否重复出现,如果重复了就是return false, 否则一直找到sum为1为止。

更正后的代码:

class Solution {
public:
    bool isHappy(int n) {
        int res; //记录平方和
        int tmp;
        unordered_set<int> set;
        while(n > 3){
            res = 0;
            while(n){
                tmp = n%10;
                n /= 10;
                res = res + tmp * tmp;
            }
            if(res == 1) return true;
            if(set.find(res) != set.end()) return false;
            else set.insert(res);
            n = res;
        }
        if(n == 1) return true;
        return false;
    }
};
1. 两数之和

O(n^2)做法:

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        int n = nums.size();
        for (int i = 0; i < n; ++i){
            for (int j = i + 1; j < n; ++j){
                if (nums[i] + nums[j] == target) {
                    return {i, j};
                }
            }
        }
        return {};
    }
};

用map解决:

思路:以target = 9为例,遍历到数组中的3的时候,去找哈希表里是否存在6,如果存在6,就返回它的下标。

所以,我们要知道是否存在这个元素的同时,还想知道这个元素的下标,只能用map(key - value)来做哈希映射

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};
            }
            map.insert(pair<int, int>(nums[i], i));
        }
        return {};
    }
};

1.“auto iter = map.find(target - nums[i]);”中,auto关键字的作用?

auto用于自动推导变量的类型,map.find(target - nums[i])返回的是一个迭代器类型unordered_map<int,int>::iterator

具体来说:

1.如果找到了目标值:

  • 返回指向找到的键值对的迭代器

  • 通过这个迭代器,可以使用:

    • iter->first 访问键(key)

    • iter->second 访问值(value)

  1. 如果没找到目标值:

  • 返回 map.end(),这是一个特殊的迭代器,表示到达容器的末尾

  • 这就是为什么代码中要判断 if(iter != map.end())

2.“map.insert(pair<int, int>(nums[i], i));”中,pair是什么?

pair用于将两个字合成一个单元,pair<int, int>(nums[i], i)创造了一个键值对,然后插入到unordered_map中,作为映射关系。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2268317.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Mumu模拟器12开启ADB调试方法

在使用安卓模拟器进行开发或调试时&#xff0c;ADB&#xff08;Android Debug Bridge&#xff09;是一项不可或缺的工具。大多数模拟器默认开启了ADB调试功能&#xff0c;但在安装最新版的 Mumu模拟器12 时&#xff0c;可能会遇到 adb devices 无法识别设备的问题。 问题描述 …

金融租赁系统的创新发展与市场竞争力提升探讨

内容概要 随着经济的快速发展&#xff0c;金融租赁系统逐渐成为金融市场中不可或缺的一环。它不仅提供了灵活的资金解决方案&#xff0c;还促进了企业的资本结构优化与资源配置效率。因此&#xff0c;了解该系统的市场背景与发展现状至关重要。 在现今环境下&#xff0c;新兴…

SQL 实战:基于经纬度的距离计算与位置查询

在位置服务&#xff08;LBS&#xff09;系统中&#xff0c;基于地理位置查询和距离计算是核心功能之一。例如&#xff1a; 查找附近的商铺、加油站或医院。计算两点之间的实际直线距离。筛选出指定范围内的用户或设备位置。 MySQL 提供了多种方式实现地理位置查询&#xff0c…

DAY1牛客题库1-3算法题:C语言版本(思路仅供参考)

挑战一下7天刷完牛客题库的108个题&#xff0c;今天是第一天思密达~一直以来都特别懒的做题&#xff0c;还是得勤奋点我觉得~今天只做了3个~嘻嘻明天去玩回家多弄几个~ 1.输出字符串最后一个单词长度 【1】题目&#xff1a; #include"stdio.h" #include"string…

LeetCode 83 :删除排链表中的重复元素

题目&#xff1a; 地址&#xff1a;https://leetcode.cn/problems/remove-duplicates-from-sorted-list/ 方法一&#xff1a; 方法二&#xff1a; package com.zy.leetcode.LeetCode_04;/*** Author: zy* Date: 2024-12-25-15:19* Description: 删除排链表中的里复元素* …

微信流量主挑战:用户破16!新增文档转换(新纪元3)

朋友们&#xff0c;报告好消息&#xff01;我的小程序用户数量已经涨到16个了&#xff01;没错&#xff0c;真没拉朋友圈亲戚好友来撑场子&#xff0c;全靠实力&#xff08;和一点点运气&#xff09;吸引了16位陌生小伙伴光临&#xff01;这波进步&#xff0c;连我自己都感动了…

Java-38 深入浅出 Spring - AOP切面增强 核心概念 相关术语 Proxy配置

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 大数据篇正在更新&#xff01;https://blog.csdn.net/w776341482/category_12713819.html 目前已经更新到了&#xff1a; MyBatis&#xff…

基于Docker+模拟器的Appium自动化测试(二)

模拟器的设置 打开“夜神模拟器”的系统设置&#xff0c;切换到“手机与网络”页&#xff0c;选中网络设置下的“开启网络连接”和“开启网络桥接模式”复选框&#xff0c;而后选择“静态IP”单选框&#xff0c;在IP地址中输入“192.168.0.105”&#xff0c;网关等内容不再赘述…

【从零开始入门unity游戏开发之——C#篇36】C#的out协变和in逆变如何解决泛型委托的类型转换问题

文章目录 一、知识回顾和问题分析1、回顾强制转换和as转换知识2、问题分析 二、为什么泛型委托不行&#xff1f;1、泛型类型的严格类型检查2、**as 和强制类型转换不能直接使用** 三、如何解决这个问题&#xff1f;1、**协变&#xff08;out&#xff09;**2、**逆变&#xff08…

深度学习使用Anaconda打开Jupyter Notebook编码

新手入门深度学习使用Anaconda打开Jupyter Notebook编码 1. 安装Anaconda 第一种是Anaconda官网下载安装包&#xff0c;但是很慢&#xff0c;不太建议 第二种使用国内清华大学镜像源下载 选择适合自己电脑的版本&#xff0c;支持windows&#xff0c;linux系统 下载完之后自行…

Linux套接字通信学习

Linux套接字通信 代码源码&#xff1a;https://github.com/say-Hai/TcpSocketLearn/tree/CThreadSocket 在网络通信的时候, 程序猿需要负责的应用层数据的处理(最上层)&#xff0c;而底层的数据封装与解封装&#xff08;如TCP/IP协议栈的功能&#xff09;通常由操作系统、网络协…

git clone 和 conda 换源

文章目录 git clone 通过 sshconda 创建虚拟环境通过 env.yml 文件conda 换源 git clone 通过 ssh git clone ssh://用户名IP地址:/仓库名字.gitconda 创建虚拟环境通过 env.yml 文件 conda env create -f environment.ymlconda 换源 Step 1 生成 .bashrc 文件在家目录下。…

机床数据采集网关在某机械制造企业的应用

随着工业4.0时代的到来&#xff0c;智能制造已成为制造业转型升级的重要方向。数控机床作为现代制造业的核心设备&#xff0c;其运行状态和加工参数的数据实时采集与分析对于提升生产效率、优化生产流程具有关键意义。 背景概述 某机械制造企业拥有多台数控机床&#xff0c;这…

c# RSA加解密工具,.netRSA加解密工具

软件介绍 名称: c# RSA加解密工具,.netRSA加解密工具依赖.net版本: .net 8.0工具类型: WinForm源码下载 c# RSA加解密工具,.netRSA加解密工具 依赖项 WinFormsRSA.csproj <Project

穷举vs暴搜vs深搜vs回溯vs剪枝_全排列_子集

46. 全排列 递归解决&#xff1a;一开始选一个数&#xff0c;递归进入下一层再选一个新的数&#xff0c;直到到最后一个数。反会上一层遍历其它数。 每次递归到叶子节点就找到了一种组合&#xff0c;思路有了具体怎么实现&#xff1f; 1.怎么记录每条路径&#xff1f; 定义一个…

【Trick】获取kaggle账号的token和api(用于数据集下载)

0&#xff1a;操作背景 由于未来的科研需要用到Unet&#xff0c;但是运行学长的史山代码无法跑通&#xff0c;自己写了一个Unet并load学长的数据集效果也很差&#xff0c;于是打算从最最基础的开始&#xff0c;上github调用一个Unet并成功在公有数据集上跑一遍实例。 Unet的g…

VS Code AI开发之Copilot配置和使用详解

随着AI开发工具的迅速发展&#xff0c;GitHub Copilot在Cursor、Winsuf、V0等一众工具的冲击下&#xff0c;推出了免费版本。接下来&#xff0c;我将为大家介绍GitHub Copilot的配置和使用方法。GitHub Copilot基于OpenAI Codex模型&#xff0c;旨在为软件开发者提供智能化的代…

论文解读 | NeurIPS'24 Lambda:学习匹配先验以处理无标记垂悬问题场景下的实体对齐任务...

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入&#xff01; 点击 阅读原文 观看作者讲解回放&#xff01; 作者简介 尹航&#xff0c;上海交通大学博士生 内容简介 我们研究了带有无标记悬挂问题的实体对齐&#xff08;EA&#xff09;任务&#xff0c;即部分实体在另一个…

评分模型在路网通勤习惯分析中的应用——提出问题(1)

1、问题的由来、目标和意义 最近一段时间和公司其它业务部门讨论时&#xff0c;发现一个有趣的交通路网问题&#xff0c;车辆从S点行驶到V点共用时40分钟&#xff0c;这段时间内路网中的卡口摄像头识别到了车辆通过的信息。如下图所示&#xff1a; 设计师需要通过这些有限的路…

Spring Security day 11.23

ok了今天学习一个关于登录角色权限的管理框架&#xff0c;我们一起取看看吧 一.权限控制 1.1 认证和授权概念 前面我们已经完成了后台管理系统的部分功能&#xff0c;例如检查项管 理、检查组管理、套餐管理、预约设置等。接下来我们需要思 考 2 个问题&#xff1a; 问题 1 …