【LeetCode每日一题:[面试题 17.05] 字母与数字-前缀和+Hash表】

news2024/11/26 12:51:06

在这里插入图片描述

题目描述

给定一个放有字母和数字的数组,找到最长的子数组,且包含的字母和数字的个数相同。

返回该子数组,若存在多个最长子数组,返回左端点下标值最小的子数组。若不存在这样的数组,返回一个空数组。

示例 1:

输入: [“A”,“1”,“B”,“C”,“D”,“2”,“3”,“4”,“E”,“5”,“F”,“G”,“6”,“7”,“H”,“I”,“J”,“K”,“L”,“M”]

输出: [“A”,“1”,“B”,“C”,“D”,“2”,“3”,“4”,“E”,“5”,“F”,“G”,“6”,“7”]
示例 2:

输入: [“A”,“A”]

输出: []
提示:

array.length <= 100000

求解思路

  1. 首先我们查看题目给定的数据范围去大致确定一个求解的策略;
  2. 然后我们对给定的题目进行题目分析,题目要求我们从一个只有字母和数字组成的数组中去找到最长的子数组,这个最长的子数组中字母和数字的个数是需要相同的;
  3. 读完题目大家肯定还是有些疑惑?我们可以对题目做一个简单的转化,你可能就熟悉了,我们可以将最长子数组中字母和数字个数相同的最长长度,转换为最长子数组和为0;
  4. 有同学就有疑问了?怎么求最长子数组和为0呢?我们可以在遍历这个字符串数组中把遇到的数字进行加1操作,遇到的字母进行减1的操作,或者反过来都是可以的,该过程通过预处理前缀和求解;
  5. 接下来我们在遍历前缀和数组的时候,如果直接通过双重循环求解最终结果的话,肯定是超时,那么该怎么解决呢?我们可以通过Hash表记录位置来进行求解。
  6. 此时我们可以通过Hash表来求解,该过程的思路和俩数之和的思路很想,在收集答案的过程中,此时我们需要维护一个前缀和等于0的区间。right-left=0,也就是right=left。
  7. 如果当前Hash表不包含当前的值,直接加入当前值作为key,和当前的下标作为value。如果存在当前的key,那么我们就可以尝试更新答案,找到最长的子串,并且记录最左的位置在哪里。
  8. 最后,我们找到了left最长子数组的最左下标,max最长子数组的长度,此时我们开辟数组空间,直接求解。返回最终收集到的数据。

实现代码

class Solution {
    public String[] findLongestSubarray(String[] array) {
        int n=array.length;
        int[] arr=new int[n+1];
        for(int i=0;i<n;i++){
            arr[i+1]=arr[i]+(Character.isLetter(array[i].charAt(0))?-1:1);
        }
        HashMap<Integer,Integer> map=new HashMap<>();
        map.put(0,0);
        int max=0,left=-1;
        for(int i=0;i<=n;i++){
            int curSum=arr[i];
            if(map.containsKey(curSum)){
                if(i-map.get(curSum)>max){
                    max=i-map.get(curSum);
                    left=map.get(curSum);
                }
            }else{
                map.put(curSum,i);
            }
        }
        String[] res;
        if(left!=-1){
            res=new String[max];
            int cnt=0;
            for(int i=left;i<left+max;i++){
                res[cnt++]=array[i];
            }
        }else{
            res=new String[]{};
        }
        return res;
    }
}

在这里插入图片描述

运行结果

在这里插入图片描述

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

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

相关文章

LDGRB-01 3AFE61320954P0001

LDGRB-01 3AFE61320954P0001变频器的作用_变频器工作原理变频器是把工频电源&#xff08;50Hz或60Hz&#xff09;变换成各种频率的交流电源&#xff0c;以实现电机的变速运行的设备&#xff0c;其中控制电路完成对主电路的控制&#xff0c;整流电路将交流电变换成直流电&#x…

教育培训机构屡遭投诉?湖南中创教育给出三点建议

在中消协发布的《2021年校外教育培训领域消费者权益保护报告》中&#xff0c;受新冠疫情以及校外教育培训行业治理政策的冲击&#xff0c;我国校外教育培训领域消费维权舆情及消费者投诉呈上升趋势。2021年全国消协组织受理有关校外教育培训的投诉案件共80,528件&#xff0c;同…

探索N-gram模型:语言模型中的基础算法

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️&#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

Proteus8.15安装教程

1、解压Proteus8.15 安装包&#xff0c;然后双击进去&#xff0c;找到setup文件&#xff0c;右键&#xff0c;以管理员身份运行。 2、需要安装一些插件&#xff0c;点击“next”。把插件安装完成。 点击“finfish” 点击“install” 点击“Cancel” 3、如果没有上面步骤&…

零拷贝技术

1. 零拷贝技术 零拷贝就是一种避免 CPU 将数据从一块存储拷贝到另外一块存储的技术。针对操作系统中的设备驱动程序、文件系统以及网络协议堆栈而出现的各种零拷贝技术极大地提升了特定应用程序的性能&#xff0c;并且使得这些应用程序可以更加有效地利用系统资源。这种性能的…

latex使用笔记

在线表格转latex格式:https://tablesgenerator.com/ 在线公式转latex格式:https://latex.91maths.com/ 1、希腊字母 eg.σ 2、% 3、大小写罗马数字 大写罗马数字&#xff1a;\uppercase\expandafter{\romannumeral} 在romannumeral后加上相应的数字即可。 eg.Ⅱ \uppercas…

Python每日一练(20230311)

目录 1. 合并两个有序数组 2. 二叉树的右视图 3. 拼接最大数 &#x1f31f; 每日一练刷题专栏 C/C 每日一练 ​专栏 Python 每日一练 专栏 1. 合并两个有序数组 给你两个有序整数数组 nums1 和 nums2&#xff0c;请你将 nums2 合并到 nums1 中&#xff0c;使 nums1 成为…

SpringSecurity第一讲

目录 一、SpringSecurity01 1.2 什么是会话 1.2.1 基于session的认证 1.2.2 基于ToKen的认证 1.3 什么是授权 1.3.1 为什么要授权 1.3.2 SpringSecurity简介 1.4 SpringSecurity入门 1.4.1 pom文件 1.4.2 主启动类 1.4.3 创建控制层 1.4.4 启动项目进行测试 1.5 自…

工作三年,月薪不到20k,软件测试工程师,担心被应届生取代

工作了3年&#xff0c;一个月工资不到20K&#xff0c;担心被应届毕业生取代&#xff01; 互联网的快速发展伴随着员工适者生存的加速。几年是一条分界线。如果人们的能力和体力不够&#xff0c;他们就会被淘汰。生动的工作生活让许多人焦虑不安。 最近&#xff0c;一名来自211本…

Java分布式事务(五)

前言 随着互联网的快速发展&#xff0c;软件系统由原来的单体应用转变为分布式应用&#xff0c;下图描述了单体应用向微服务的演变。 文章目录&#x1f525;分布式事务处理-认识分布式事物&#x1f525;分布式架构的理论知识-CAP理论&#x1f525;分布式事务处理-分布式事务产…

查询校园网是否支持IPv6绕过校园网

方法一、连接校园网&#xff0c;登录认证网络可用后返回WIFI页面点击校园网WIFI的属性查看是否有IPV6地址 本地的IPV6地址不算哦 &#xff08;一般IPv6地址都是数字开头&#xff0c;fe80开头的都是本地IPv6地址是没用的&#xff09;方法二、连接校园网&#xff0c;登录认证网络…

《信号分析与处理》期末复习题库整理(题目+手写知识点+答案+期末知识点精细)

文章目录一、傅里叶变换、s域变换、z域变换&#xff08;待&#xff1a;整理一些常用以及方程变换&#xff09;傅里叶变换s域变换z域变换二、试卷一、选择题12345678910111213141516171819202122232425262728二、填空题123567891011121314151617三、计算题123456781011121314151…

shiro反序列化

shiro550反序列化 | 清风的博客这个看着更舒服点 环境搭建 JDK&#xff1a;1.7 Tomcat&#xff1a;8.5.83 shiro源码&#xff1a;下载地址&#xff1a;https://codeload.github.com/apache/shiro/zip/shiro-root-1.2.4 shiro war包&#xff1a;下载地址SHIRO-550/samples-…

逻辑优化基础-disjoint support decomposition

先遣兵 在了解 disjoint support decomposition 之前&#xff0c;先学习两个基本的概念。 disjoint 数学含义上的两个集合交集&#xff0c;所谓非相交&#xff0c;即交集为空集。 A∩BC⊘A \cap B C \oslash A∩BC⊘ support 逻辑综合中的 supportsupportsupport 概念是…

【创建“待选项”按钮02计算坐标 Objective-C语言】

一、之前,我们已经把“待选项”按钮,创建好了,但是唯一的问题是,坐标都是一样的,所以都显示在一起了 1.下面,我们来设置一下,这些“待选项”按钮的坐标, 现在,“待选项”按钮的坐标,是不是都在同一个位置啊, 回忆一下,这个待选项按钮,是怎么生成的, 首先,是在…

PCA-APCA-MLR

全称 principal component analysis-absolute principal component score-multiple linear regression 原理 绝对因子分析/多元线性回归受体模型(APCS—MLR)的基本原理是将因子分析的主因子得分转化为绝对主因子得分(APCS),各指标含量再分别对所有的APCS进行多元线性回…

课程作业及比赛任务,已支持 Notebook 内直接提交|ModelWhale 版本更新

早春时节、万物复苏&#xff0c;我们又迎来了 ModelWhale 新一轮的版本更新。本次更新中&#xff0c;ModelWhale 主要进行了以下功能迭代&#xff1a;新增 Notebook 内提交课程作业及比赛任务&#xff08;团队版✓ &#xff09;新增 Canvas 组件停止维护提示&#xff08;团队版…

44-Golang中的channel

Golang中的channel为什么要使用channelchannel的介绍channel的基本使用定义/声明channel管道的遍历和关闭channel的关闭channel的遍历goroutine和channel结合应用实例1应用实例2案例注意事项为什么要使用channel 前面使用全局变量加锁同步来解决goroutine的通讯&#xff0c;但…

设计模式—适配器模式

适配器模式&#xff08;Adapter Pattern&#xff09;是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式&#xff0c;它结合了两个独立接口的功能。这种模式涉及到一个单一的类&#xff0c;该类负责加入独立的或不兼容的接口功能。举个真实的例子&#xff0c…

【操作系统】如何排查死锁?

【操作系统】如何排查死锁&#xff1f; 文章目录【操作系统】如何排查死锁&#xff1f;死锁的概念死锁的排查工具排查工具 1&#xff1a;jstack排查工具 2&#xff1a;jconsole死锁的发生条件互斥条件持有并等待条件不可剥夺条件环路等待条件避免死锁问题的发生总结死锁的概念 …