双非本科准备秋招(9.2)——力扣哈希

news2024/11/15 13:42:58

1、383. 赎金信

跟昨天的题大同小异,因为只有26个字母,所以可以建个有26个坑位的数组。

做完昨天的题目,这个题没啥新意。

class Solution {
    public boolean canConstruct(String ransomNote, String magazine) {
        int[] hashTable = new int[26];
        char[] chars1 = ransomNote.toCharArray();
        char[] chars2 = magazine.toCharArray();

        for(char c : chars2){
            hashTable[c - 'a']++;
        }

        for(char c : chars1){
            if(hashTable[c - 'a'] == 0){
                return false;
            }
            hashTable[c-'a']--;
        }

        return true;
    }
}

2、454. 四数相加 II

开始上强度了,200个数据,直接暴力,200的4次方不行。

可以把四层for拆成两层,把nums1和nums2求和得到的数据放到它们的哈希表中,value记录出现的次数。这样就拆成两个哈希表了,遍历一个哈希表,那么-key就是另一个哈希表中需要存在的值,如果存在,这两个哈希表的value之积就是一个解。

举例说明:key1=-1, value1=2 和 key2=1, value=3 

那是不是意味着有:-1   -1,  1  1  1。对每个-1来说,都能找到3个1。所以有2*3个。

class Solution {
    public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
        HashMap<Integer, Integer> map1 = new HashMap<>();
        HashMap<Integer, Integer> map2 = new HashMap<>();
        int ans = 0;
        merge(nums1, nums2, map1);
        merge(nums3, nums4, map2);
        
        for(int x : map1.keySet()){
            int target = -x;
            if(map2.containsKey(target)){
                ans += map1.get(x)*map2.get(target);
            }
        }

        return ans;
    }
    public void merge(int[] a1, int[] a2, HashMap<Integer, Integer> map){
        for(int x : a1){
            for(int y : a2){
                int n = x+y;
                if(map.containsKey(n)){
                    map.put(n, map.get(n)+1);
                }
                else{
                    map.put(n, 1);
                }
            }
        }
    }
}

3、15. 三数之和

第一次是这么做的,不对。

思路来自上一题,但是我再想如何去重呢?总不能查一次List中有没有nums[i]、nums[j]、nums[k]的组合吧,想了很久没想出来。

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        ArrayList<List<Integer>> list = new ArrayList<>();
        HashMap<Integer, Integer> map = new HashMap<>();

        for(int i = 0; i < nums.length; i++){
            //记录最后一次的下标
            map.put(nums[i], i);
        }

        for(int i = 0; i < nums.length; i++){
            for(int j = i+1; j < nums.length; j++){
                if(map.containsKey(-nums[i]-nums[j])){
                    int k = map.get(-nums[i]-nums[j]);
                    if(k != i && k != j){
                        list.add(List.of(nums[i], nums[j], nums[k]));
                    }
                }
            }
        }

        return list;
    }
}

参考了另一种巧妙的思路,双指针。

先给数组排个序。

然后遍历数组,i就是遍历的元素,j和k是双指针,通过移动j和k来取得答案。

思路到这里,那么和上面的代码没啥区别,所以核心还是想如何去重。

因为是排完序的,那么我只需要保证i和上一个元素不相等即可,如下图,如果i和上一个元素相等,说明接下来得到的值肯定都是重复的。

然后是对nums[j]和nums[k]去重,比如这种的,会找到两组(-1, 0, 1)。

所以每次找完之后,都要不停地移动j,直到与上一个元素不同,k同理。

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        ArrayList<List<Integer>> list = new ArrayList<>();
        
        int j = 0, k = 0;
        Arrays.sort(nums);
        for(int i = 0; i < nums.length-2; i++){
            if(nums[i] > 0){//第一个都大于0,那肯定加不成0了。
                break;
            }
            if(i > 0 && nums[i] == nums[i-1]){//去重nums[i]
                continue;
            }
            j = i+1;
            k = nums.length-1;
            while(j < k){
                if(nums[j] + nums[k] + nums[i] == 0){
                    list.add(List.of(nums[i], nums[j], nums[k]));
                    while(j<nums.length-1 && nums[j] == nums[j+1]) j++;//去重nums[j]
                    while(k>i && nums[k] == nums[k-1]) k--;//去重nums[k]
                    j++;k--;
                }
                else if(nums[j] + nums[k] + nums[i] > 0){
                    k--;
                }
                else if(nums[j] + nums[k] + nums[i] < 0){
                    j++;
                }
            }
        }

        return list;
    }
}

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

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

相关文章

shell脚本5 函数 数组

函数 试题1 查看版本 如果想更方便&#xff0c;可以建立一个专门存函数的文件 将func.sh里面的命令都移到func文件夹里面&#xff0c;在脚本里面执行文件夹更方便 输入echo $?反馈的结果都是0&#xff0c;都认为是正确的 无法使用$?去检验是否正确&#xff0c;所以要在后面增…

python 基础知识点(蓝桥杯python科目个人复习计划27)

今日复习内容&#xff1a;基础算法中的递归 1.介绍 递归&#xff1a;通过自我调用来解决问题的函数递归通常把一个复杂的大问题层层转化为一个与原问题相似的规模较小的问题来解决 递归要注意&#xff1a;&#xff08;1&#xff09;递归出口&#xff1b;&#xff08;2&#x…

使用 Redis 的 List 数据结构实现分页查询的思路

假设有一个存储数据的 List&#xff0c;每个元素代表一个记录&#xff0c;例如 recordsList。 按页存储数据&#xff1a; 每页存储一定数量的记录。例如&#xff0c;第一页存储索引 0 到 N-1 的记录&#xff0c;第二页存储索引 N 到 2N-1 的记录&#xff0c;以此类推。 分页查…

单片机介绍

本文为博主 日月同辉&#xff0c;与我共生&#xff0c;csdn原创首发。希望看完后能对你有所帮助&#xff0c;不足之处请指正&#xff01;一起交流学习&#xff0c;共同进步&#xff01; > 发布人&#xff1a;日月同辉,与我共生_单片机-CSDN博客 > 欢迎你为独创博主日月同…

IDEA开发使用 thymeleaf 模板$表达式报红波浪线解决方案

系列文章目录 文章目录 系列文章目录后端存值前端取值thymeleaf 后端存值 RequestMapping("/testModelAndView")//使用ModelAndView时返回的方法类型必须是ModelAndViewpublic ModelAndView testModelAndView() {//创建ModelAndView对象ModelAndView mav new Model…

# Redis 分布式锁如何自动续期

Redis 分布式锁如何自动续期 何为分布式 分布式&#xff0c;从狭义上理解&#xff0c;也与集群差不多&#xff0c;但是它的组织比较松散&#xff0c;不像集群&#xff0c;有一定组织性&#xff0c;一台服务器宕了&#xff0c;其他的服务器可以顶上来。分布式的每一个节点&…

2024年【N1叉车司机】考试内容及N1叉车司机复审考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 N1叉车司机考试内容是安全生产模拟考试一点通生成的&#xff0c;N1叉车司机证模拟考试题库是根据N1叉车司机最新版教材汇编出N1叉车司机仿真模拟考试。2024年【N1叉车司机】考试内容及N1叉车司机复审考试 1、【多选题…

SpringSecurity笔记

SpringSecurity 本笔记来自三更草堂&#xff1a;https://www.bilibili.com/video/BV1mm4y1X7Hc/?spm_id_from333.337.search-card.all.click&#xff0c;仅供个人学习使用 简介 Spring Security是Spring家族中的一个安全管理框架。相比与另外一个安全框架Shiro&#xff0c;…

【Django开发】前后端分离美多商城项目:项目准备和搭建(附代码,文档)

本系列文章md笔记&#xff08;已分享&#xff09;主要讨论django商城项目开发相关知识。本项目利用Django框架开发一套前后端不分离的商城项目&#xff08;4.0版本&#xff09;含代码和文档。功能包括前后端不分离&#xff0c;方便SEO。采用Django Jinja2模板引擎 Vue.js实现…

【硬件产品经理】避免硬件产品失败 | 技术维度

目录 简介 技术维度一&#xff1a;低估产品开发 技术维度二&#xff1a;低估规模生产的复杂性 技术维度三&#xff1a;测试不足 技术维度四&#xff1a;产品太复杂 技术维度五&#xff1a;对客户承诺太高 推荐内容 简介 这节内容主要从技术维度来谈谈避免硬件产品失败这…

Spring Security关键之5张数据表与7张表 !!!

一、什么是认证和授权&#xff1a; 认证&#xff1a;系统提供的用于识别用户身份的功能&#xff0c;通常提供用户名和密码进行登录其实就是在进行认证&#xff0c;认证的目的是让系统知道你是谁。授权&#xff1a;用户认证成功后&#xff0c;需要为用户授权&#xff0c;其实就…

arcgis 批量删除字段

一、打开ArcToolbox-数据管理工具-字段-删除字段。 二、在输入表中选择要删除字段的要素&#xff0c;在删除字段栏中选择要删除的字段&#xff0c;点击确认即可。

SpringCloud-高级篇(十八)

前面我们已经实现了多级缓存架构&#xff0c;大大提高了查询商品的性能&#xff0c;缓存在提高性能的同时&#xff0c;也带来了一致性的问题&#xff0c;比如说数据库发生了修改&#xff0c;这个时候&#xff0c;如果缓存依然是旧的数据&#xff0c;两者就产生了不一致&#xf…

演练纪实|同创永益助力大型农商行圆满完成2023年度灾备切换演练

为进一步强化银行灾备自动化运行提高系统风险应急能力、提升自动化运维平台的稳定性和可靠性、保障业务连续性&#xff0c;12月16日&#xff0c;某农商银行联合同创永益开展灾备自动化运维平台项目切换演练&#xff0c;同创永益开发交付中心北方交付二组同事参与本次演练。 本次…

在线制作gif动图怎么做?一个方法轻松制作gif动画

有时候一张普通的图片无法表达出我们的意思&#xff0c;但是视频又比较长看起来太过复杂。这时候&#xff0c;大家就可以使用gif动图了&#xff0c;不需要下载软件使用gif生成器&#xff08;https://www.gif.cn/&#xff09;-GIF中文网&#xff0c;轻松一键就能快速完成gif在线…

Pytest与unittest区别

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

面试项目问题

文章目录 1. 你们这个项目多少人在做?人员分布是怎样的?做了多长时间?2. 你们项目一共有几个端? 每个端都是哪些人在用? 作用是什么? 有哪些模块?3. 你们项目一共有几个微服务? 每个微服务负责的任务是什么?4. 你们项目一共有几个数据库? 你负责的数据库是哪个? 核心…

在centos 7 中安装配置Jdk、Tomcat、及Tomcat自启动

目录 一、安装配置Jdk 1.创建目录并上传文件 2.解压JDK压缩包 3.配置JDK环境变量 4.设置环境变量生效 二、安装配置Tomcat 1.上传Tomcat并解压 2.启停Tomcat 3.修改tomcat-user.xml配置 4.配置远程访问Tomcat 5.远程项目发布 三.Tomcat自启动配置 1.配置Tomcat自启…

npm ERR! path E:node_modules\node-sass

分析报错发现有关 python2 环境相关报错 解决办法&#xff1a;需要再电脑中安装python 2.X版本的环境 因为我本地电脑有python 3.9的环境&#xff0c;所以我使用 Anaconda安装python环境 1、安装 python 2.7 conda create -n py2 python2.72、激活虚拟环境 conda activate…

基于STM32的以太网通信协议选择与实现

在基于STM32的以太网通信中&#xff0c;主要涉及到选择合适的通信协议和实现对应的功能代码。常见的通信协议包括TCP/IP、UDP、HTTP等&#xff0c;选择合适的协议取决于具体应用需求。以下将介绍在STM32上进行以太网通信时&#xff0c;常用的通信协议选择以及对应功能代码的实现…