【每日一题Day143】面试题 17.05. 字母与数字 | 前缀和+哈希表

简介: 【每日一题Day143】面试题 17.05. 字母与数字 | 前缀和+哈希表

面试题 17.05. 字母与数字

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

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

和昨天的很像呀,但是我在数组拷贝的时候 写成了res[i]=array[i],然后一直越界,找了半天bug,真的有被自己蠢到。。。。

  • 思路:
  • 字符串数组转化为前缀和数组,为字母的记为1分,为数字的记为-1分,那么当连续子数组的总分为0时,该子数组包含的字母和数字的个数相同。
  • 实现
  • 统计前缀和数组,对于每一个右边界,此时的前缀和记为sum,寻找合法的左边界,当左边界的前缀和也为sum时,子数组array[left,right]中字母和数字的个数相同,记录最长合法子数组的左右边界
class Solution {
    public String[] findLongestSubarray(String[] array) {
        int n = array.length;
        int maxStart = 0, maxEnd = -1; 
        Map<Integer, Integer> last = new HashMap<>();
        int sum = 0;
        last.put(0, 0);
        for (int i = 0; i < n; i++){
            if (Character.isLetter(array[i].charAt(0))){
                sum += 1;
            }else{
                sum -= 1; 
            }        
            if (last.containsKey(sum)){
                int j = last.get(sum);
                if (i + 1 - j > maxEnd - maxStart){
                    maxEnd = i + 1;
                    maxStart = j;
                }                
            }else{
                last.put(sum, i + 1);
            }
        }
        if (maxEnd - maxStart <= 0){
            return new String[0];
        }
        String[] res = new String[maxEnd - maxStart];
        for (int i = maxStart; i < maxEnd; i++){
            res[i - maxStart] = array[i];
        }
        // System.arraycopy(array, maxStart, res, 0, maxEnd - maxStart);
        // return Arrays.copyOfRange(array, maxStart, maxEnd);
        return res;
    }
}

复杂度

时间复杂度:O ( n )

空间复杂度:O ( n )

目录
相关文章
|
2月前
力扣面试经典题之哈希表
力扣面试经典题之哈希表
23 0
|
2月前
|
存储 算法 程序员
【Leetcode 程序员面试金典 01.01】判定字符是否唯一 —— 位运算|哈希表
可以使用哈希表或位运算来解决此问题:由题可知s[i]仅包含小写字母,int[26]即能表示字符的出现次数;
|
12天前
|
存储 算法 Java
面试高频算法题汇总「图文解析 + 教学视频 + 范例代码」之 二分 + 哈希表 + 堆 + 优先队列 合集
面试高频算法题汇总「图文解析 + 教学视频 + 范例代码」之 二分 + 哈希表 + 堆 + 优先队列 合集
|
22天前
|
存储 算法 大数据
深入解析力扣170题:两数之和 III - 数据结构设计(哈希表与双指针法详解及模拟面试问答)
深入解析力扣170题:两数之和 III - 数据结构设计(哈希表与双指针法详解及模拟面试问答)
|
2月前
|
存储 算法 Java
数据结构与算法面试题:实现一个哈希表,并考虑哈希冲突的解决方案。
数据结构与算法面试题:实现一个哈希表,并考虑哈希冲突的解决方案。
31 0
|
编译器 API C语言
力扣面试题17.04 - 消失的数字【求和相减 + 异或位运算 + 哈希表】
三种方法巧解力扣面试题17.04 - 消失的数字,你值得拥有
115 0
力扣面试题17.04 - 消失的数字【求和相减 + 异或位运算 + 哈希表】
代码面试之哈希表
哈希表是种数据结构,它可以提供快速的插入操作和查找操作。第一次接触哈希表时,它的优点多得让人难以置信。不论哈希表中有多少数据,插入和删除(有时包括侧除)只需要接近常量的时间即0(1)的时间级。实际上,这只需要几条机器指令。
|
4天前
|
算法 Java 调度
《面试专题-----经典高频面试题收集四》解锁 Java 面试的关键:深度解析并发编程进阶篇高频经典面试题(第四篇)
《面试专题-----经典高频面试题收集四》解锁 Java 面试的关键:深度解析并发编程进阶篇高频经典面试题(第四篇)
9 0
|
11天前
|
设计模式 SQL JavaScript
java面试宝典全套含答案
java面试宝典全套含答案
|
11天前
|
存储 Java
java面试题大全带答案_面试题库_java面试宝典2018
java面试题大全带答案_面试题库_java面试宝典2018