[LeetCode]面试题 17.05. 字母与数字

2023-11-04

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

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

示例 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,数字对应-1,寻找长度为0的子数组。其中的更新方法就是遍历,找到相同的sum,sum之间的所有数便是一个新的子数组,判断是否更新最大子数组即可。

C++:

class Solution {
public:
    vector<string> findLongestSubarray(vector<string>& array) {
        unordered_map<int,int> mp;
        mp[0] = -1;//起初无前缀时下标为-1
        int maxLength  = 0;//当前的子数组长度
        int start_index = 0;//子数组首下标
        int n = array.size();
        int sum = 0;
        for(int i = 0;i<n;i++){
            if(isalpha(array[i][0])) sum++;//如果是字母 sum++
            else sum--;
            if(mp.count(sum)){//倘若已经存在这个数 则这两个数之间的所有数即为一个新的子数组(之间的数和为0)
                int first_index = mp[sum];//新子数组首下标
                if(i-first_index>maxLength){//如果新子数组长度大于maxLength 则更换最长子数组
                    maxLength = i-first_index;//更新最大长度
                    start_index = first_index+1;//更新子数组首下标
                }
                
            }else{//不存在则存入哈希表
                mp[sum] = i;
            }
        }
        return vector<string>(array.begin()+start_index,array.begin()+start_index+maxLength);//返回子数组
    }
};

Java:

class Solution {
    public String[] findLongestSubarray(String[] array) {
        HashMap<Integer,Integer> mp = new HashMap<>();
        mp.put(0,-1);//起初无前缀时下标为-1
        int maxLength  = 0;//当前的子数组长度
        int startIndex = 0;//子数组首下标
        int n = array.length;
        int sum = 0;
        for(int i = 0;i<n;i++){
            if(Character.isLetter(array[i].charAt(0))) sum++;//如果是字母 sum++
            else sum--;
            if(mp.containsKey(sum)){//倘若已经存在这个数 则这两个数之间的所有数即为一个新的子数组(之间的数和为0)
                int first_index = mp.get(sum);//新子数组首下标
                if(i-first_index>maxLength){//如果新子数组长度大于maxLength 则更换最长子数组
                    maxLength = i-first_index;//更新最大长度
                    startIndex = first_index+1;//更新子数组首下标
                }
                
            }else{//不存在则存入哈希表
                mp.put(sum,i);
            }
        }
        String[] ans = new String[maxLength];
        System.arraycopy(array, startIndex, ans, 0, maxLength);
        return ans;
    }
}

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[LeetCode]面试题 17.05. 字母与数字 的相关文章

随机推荐

  • 清除windows登录密码

    清除windows登录密码 原理 替换登录界面中的工具 登录界面中的轻松使用中的工具一般有放大镜 c Windows System32 Magnify exe 屏幕键盘 讲述人等 可以使用下列方法之一完成 命令行下的操作 替换后重启系统 点
  • 为什么打两拍可以消除亚稳态的影响?

    为什么打两拍可以消除亚稳态的影响 首先 我们需要了解什么是亚稳态 看下图 简单来说 就是当时钟信号上升沿到来的时候正好采样的数据也在发生变化 但是对于采样的时钟信号 如果想要采样得到一个稳定值 在clk的上升沿的前一段时间有一个建立时间TS
  • POP3协议分析

    感谢原作者 http blog csdn net bripengandre article details 2192111 POP3协议分析 第1章 POP3概述 POP3全称为Post Office Protocol version3 即
  • vue/js实现文件流下载,文件下载进度监听

    文档下载 通过文档请求 直接下载文档 url 请求路径 fileName 下载名称 size 文件大小 loadDown url fileName size var this this var xhr new XMLHttpRequest
  • django2.0.6 连接使用redis集群

    环境需要 django gt 1 8 x python 2 7 或者python gt 3 4 安装django cluster redis包 pip install django redis 注意 django redis版本需要 gt
  • springSecurity基本使用2(实现简单的登录功能)

    文章目录 前言 一 实现用户创建 登陆后才能访问接口 注重用户认证 1 定义一个内存用户 不使用默认用户 2 效果 3 退出登陆 4 再创建一个张三用户 同时支持多用户登陆 二 实现管理员功能 注重权限控制 1 创建一个普通用户demo 2
  • vue 项目代码混淆配置(自定义插件适用)带配置项注释

    文章目录 vue 项目代码混淆配置 自定义插件适用 带配置项注释 一 概要 二 混淆步骤 1 引入混淆插件 2 添加混淆配置 3 执行代码混淆 vue 项目代码混淆配置 自定义插件适用 带配置项注释 一 概要 本文章适用 vue cli3
  • clickhouse--副本、分片、Distributed

    副本的目的防止数据丢失 保证高可用 分片则是实现数据的水平切分 使用副本需要使用replicatedMergeTree存储引擎 MergeTree存储引擎存储数据时首先将数据写入内存缓冲区 然后数据被写入本地磁盘临时目录分区 待全部完成后再
  • Spring Boot 整合redis

    1 在pom xml 添加Spring Boot 的redis 依赖
  • zedboard @ vivado:SDK 加载失败

    参考链接 vivado SDK那些事儿 初试 宋桓公 vivado launch SDK ERROR Timed out 180 seconds have elapsed while waiting for XSDB server to l
  • iOS实训笔记—页面跳转与传值

    iOS开发实训第九周周报 学习知识点归纳 1 页面跳转的方式 1 UITableBarController 标签栏控制器 中的界面跳转 BOOL application UIApplication application didFinish
  • 移动端开发rem实现屏幕适配及处理页面加载页面坍塌样式错乱网页闪烁问题

    rem布局在加载的时候会出现元素一开始很小 闪烁一下恢复正常大小 问题的原因无非就是html一开始没有设置字体大小嘛 那我们就一开始按最常用的iPhone 6 尺寸 设置html的font size 50px 好了 设置html的font
  • 华为OD机试真题-水库蓄水 【2023.Q1】

    题目内容 山脉间建一个天热蓄水库 如何选取水库边界 使蓄水量最大 要求 山脉用正整数数组s表示 每个元素代表山脉的高度 选取山脉上两个点作为蓄水库的边界 则边界内的区域可以蓄水 蓄水量需排除山脉占用的空间 蓄水量的高度为两边界的最小值 如果
  • C++之this指针概念及用法

    我们知道在C 中成员变量和成员函数是分开存储的 每一个非静态成员函数只会诞生一份函数实例 也就是说多个同类型的对象会共用一块代码 那么问题是 这一块代码是如何区分那个对象调用自己的呢 C 通过提供特殊的对象指针 this指针 解决上述问题
  • CSR867x — Speaker Equalizer曲线调试笔记

    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XX 作 者 文化人 XX 联系方式 或进群 471144274 XX 版权声明 原创文章 欢迎评论和转载 转载时能告诉我一声就最
  • 面试了一个 31岁的iOS开发者,思绪万千,30岁以上的程序员还有哪些出路?

    前言 之前HR给了我一份简历 刚看到简历的第一眼 31岁 让我有点意外 实际上 现在开发趋向于年轻化 大部分都是90后 95后 毕竟 软件开发不像硬件开发一样 年限越高 相对来说越吃香 31岁 iOS开发工程师 工作经历7年 5年左右都在外
  • vscode操作vue项目的相关步骤

    1 vscode下载安装https code visualstudio com vue插件的安装 1 vetur 该插件是vue文件基本语法的高亮插件 在插件窗口中输入vetur点击安装插件就行 装好后点击文件 gt 首选项 gt 设置 打
  • 合并有序的链表

    合并有序的链表 这里是升序 只是改变指针的方向O n 也是一道超经典的题目 完整实现如下 include
  • iOS自定义弹出窗口

    链接 https www jianshu com p b9bba621b295 先看示例 最终效果图 gif 首先搭建好基础界面 void viewDidLoad super viewDidLoad 设置背景色 self view back
  • [LeetCode]面试题 17.05. 字母与数字

    给定一个放有字母和数字的数组 找到最长的子数组 且包含的字母和数字的个数相同 返回该子数组 若存在多个最长子数组 返回左端点下标值最小的子数组 若不存在这样的数组 返回一个空数组 示例 1 输入 A 1 B C D 2 3 4 E 5 F