首页 > 其他分享 >面试题 17.05. 字母与数字 (Medium)

面试题 17.05. 字母与数字 (Medium)

时间:2023-06-13 16:56:15浏览次数:51  
标签:面试题 Medium ump int 字母 17.05 prefix 数组 array

问题描述

面试题 17.05. 字母与数字 (Medium)

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

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

示例 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

解题思路

首先使用一个前缀和数组prefix,prefix[i]表示前i个数里,数字的数量减去字母的数量,遍历array,更新prefix,同时在哈希表中查找key->prefix[i]是否存在:

  • 如果存在,比较记录的最长长度len,如果大于len,则更新idx = ump[prefix[i]],并更新len = i - ump[prefix[i]]
  • 否则,更新哈希表,即ump[prefix[i]] = i

代码

class Solution {
  public:
    vector<string> findLongestSubarray(vector<string> &array) {
        int n = array.size();
        vector<string> res;
        if (n < 2) {
            return res;
        }
        unordered_set<string> ust;
        for (char c = 'a'; c <= 'z'; c++) { // 统计所有的字母
            string s(1, c);
            ust.insert(s);
        }
        for (char c = 'A'; c <= 'Z'; c++) {
            string s(1, c);
            ust.insert(s);
        }
        unordered_map<int, int> ump;
        ump[0] = 0;
        int len = 0;
        int idx = 0;
        vector<int> prefix(n + 1); // prefix[i]表示前i个数里,数字的数量减去字母的数量
        for (int i = 1; i <= n; ++i) {
            if (ust.find(array[i - 1]) == ust.end()) {
                prefix[i] = prefix[i - 1] + 1;
            } else {
                prefix[i] = prefix[i - 1] - 1;
            }
            if (ump.find(prefix[i]) != ump.end()) { // 说明存在以i - 1为右端点的子数组
                if (len < i - ump[prefix[i]]) {
                    len = i - ump[prefix[i]];
                    idx = ump[prefix[i]];
                }
            } else {
                ump[prefix[i]] = i;
            }
        }
        res.resize(len);
        for (int i = idx; i < idx + len; ++i) {
            res[i - idx] = array[i];
        }
        return res;
    }
};

标签:面试题,Medium,ump,int,字母,17.05,prefix,数组,array
From: https://www.cnblogs.com/zwyyy456/p/17478110.html

相关文章

  • 1631.最小体力消耗路径 (Medium)
    问题描述1631.最小体力消耗路径(Medium)你准备参加一场远足活动。给你一个二维rowsxcolumns的地图heights,其中heights[row][col]表示格子(row,col)的高度。一开始你在最左上角的格子(0,0),且你希望去最右下角的格子(rows-1,columns-1)(注意下标从0开始编号)。......
  • 795.区间子数组个数 (Medium)
    问题描述795.区间子数组个数(Medium)给你一个整数数组nums和两个整数:left及right。找出nums中连续、非空且其中最大元素在范围[left,right]内的子数组,并返回满足条件的子数组的个数。生成的测试用例保证结果符合32-bit整数范围。示例1:输入:nums=[2,1,4,3],......
  • 802.找到最终的安全状态 (Medium)
    问题描述802.找到最终的安全状态(Medium)有一个有n个节点的有向图,节点按0到n-1编号。图由一个索引从0开始的2D整数数组graph表示,graph[i]是与节点i相邻的节点的整数数组,这意味着从节点i到graph[i]中的每个节点都有一条边。如果一个节点没有连出的有......
  • 2718. 查询后矩阵的和 (Medium)
    问题描述2718.查询后矩阵的和(Medium)给你一个整数n和一个下标从0开始的二维数组queries,其中queries[i]=[typeᵢ,indexᵢ,valᵢ]。一开始,给你一个下标从0开始的nxn矩阵,所有元素均为0。每一个查询,你需要执行以下操作之一:如果typeᵢ==0,将第index......
  • 28.找出字符串中第一个匹配项的下标 (Medium)
    问题描述28.找出字符串中第一个匹配项的下标(Medium)给你两个字符串haystack和needle,请你在haystack字符串中找出needle字符串的第一个匹配项的下标(下标从0开始)。如果needle不是haystack的一部分,则返回-1。示例1:输入:haystack="sadbutsad",needle="sad......
  • 373. 查找和最小的 K 对数字 (Medium)
    问题描述373.查找和最小的K对数字(Medium)给定两个以升序排列的整数数组nums1和nums2,以及一个整数k。定义一对值(u,v),其中第一个元素来自nums1,第二个元素来自nums2。请找到和最小的k个数对(u₁,v₁),(u₂,v₂)...(uₖ,vₖ)。示例1:输入:nums1......
  • php面试题:一张表中,id 是主键索引,name是普通索引,下列语句都只取一条,分别有什么不同
    一张表中,id是主键索引,name是普通索引,下列语句都只取一条,分别有什么不同select*fromtable_namewherename='smith'select*fromtable_namewhereid=1考查普通索引与主键索引的运行机制。主键索引=唯一索引+非空约束,优先级高于普通索引索引运行机制:对于索引中的每一项,My......
  • 最近面试题
    面试题1.业务流程的测试点2.考虑哪些异常场景3.余额怎么看4.余额存在网站上吗?5.产品出货你关吗?6.自动化怎么做的7.文本会检查哪些东西8.有没有检查过数据库9.做自动化时不会自动检查数据库吗?10.接口测试测什么11.怎么考虑接口案例12.接口案例是自己设计的吗?13.检查接......
  • 计算机体系结构面试题
    1、请解释什么是指令级并行(Instruction-LevelParallelism,ILP)并提供一个示例说明? 在计算机体系结构中,指令级并行是指同时执行多个计算机指令的能力,以提高程序的执行速度。这种并行性的实现通常涉及到在单个指令流中发现和执行多个独立指令的方法。示例:假设有以下三个指令:ADD......
  • 1009道面试题,想刷完,要多久?
    我的面试题网站,目前已更新到1009题了,今天对所有题目做一个汇总(后续还会继续优化,继续完善):Redis的数据类型有哪些?请简述一下JVM的内存模型说说堆和栈的区别说说你对CAP的理解你知道哪些分布式事务解决方案?什么是二阶段提交?什么是HTTP?HTTP的作用是什么?说说HTTP的优点和缺点什么是长......