刷题记录:一维前缀和 | leetcode-2559. 统计范围内的元音字符串数 2023/6/2

news/2024/7/5 2:47:04

leetcode-2559. 统计范围内的元音字符串数

这道题的思路并不难找,一开始我有点看出是一维前缀和问题,但没有很确定,因此也就没有直接从这个思路走下去。还是想着先做暴力版本的吧!

这是暴力版本的代码:

class Solution {
    static String array = "aeiou";
    static int[] ret;

    static boolean judge(String str) {
        String head = str.charAt(0)+"";
        String rear = str.charAt(str.length()-1)+"";
        if(array.contains(head) && array.contains(rear)) {
            return true;
        }
        return false;
    }

    public static int[] vowelStrings(String[] words, int[][] queries) {
        ret = new int[queries.length];
        int i = 0;
        int k = 0;
        while(i < queries.length) {
            int count = 0;

            int l = queries[i][0];
            int r = queries[i][1];
            for(int j = l; j <= r; j++) {
                if(judge(words[j])) {
                    count++;
                }
            }
            ret[k++] = count;
            i++;
        }
        return ret;
    }
}

果不其然超时了😂卡在了92/93个用例。

我试图优化一下,粗暴地认为如果字符串的长度是1,那就是要找的一个答案。属于是做题做懵了(我不是在做回文串啊喂!只有一个b,b不是元音字母!),当然这个方法是不对的。

这时我做题过程中最大的问题出现了,我没有更换思路(比如自己去寻求前缀和的思路)寻求优化,而是看了看题解。不过当我看见题解的标题写着“前缀和”的时候,就没有再看下去了。

因为确定了是前缀和的思路,那我也能做出来。

思路非常简单:words数组中的元素是字符串,可以先将各个字符串按是否是元音字母首位的这一标准,映射到 a 数组。a数组就是原始数组。

初始化原始数组a后,再初始化前缀和数组s。有公式:

s[i] = s[i-1] + a[i]    //初始化s数组
a[l]加到a[r]的和 = s[r] - s[l-1]    //求前缀和

一位前缀和的公式很好推导。 按照上面这两步,很快就写好了。

这是我第一次提交的前缀和代码(注:并没有AC)。

class Solution {
    String s = "aeiou";
    int judge(String str) {
        String head = str.charAt(0)+"";
        String rear = str.charAt(str.length()-1)+"";
        if(s.contains(head) && s.contains(rear)) {
            return 1;
        }
        return 0;
    }

    public int[] vowelStrings(String[] words, int[][] queries) {
        int n = words.length; //words 原数组
        int[] a = new int[n+10];    //words数组映射成前缀和数组
        for(int i = 1; i <= n; i++) {
            a[i] = judge(words[i-1]);
        }

        int[] s = new int[n+10];    //前缀和数组
        //初始化前缀和数组
        for(int i = 1; i <= n; i++) {
            s[i] = s[i-1] + a[i];
        }

        //求前缀和
        int[] ret = new int[queries.length];
        int k = 0;
        int j = 0;
        while(k < queries.length) {
            int l = queries[k][0];
            int r = queries[k][1];
            ret[j++] = s[r] - s[l-1];    //注:此处有问题
            k++;

        }
        return ret;
    }
}

运行后,报了数组越界的问题,定位在ret[j++] = s[r] - s[l-1] 这一行。

当时由于时间比较晚了,再不回宿舍要门禁了。所以我收电脑从自习室跑了。不过心里大概有数了。第二天一早我就来自习室,开这个题,不到5分钟找出问题了。

因为我的a数组与s数组,为了操作方便,我令它们从下标1开始计数。但 l 和 r 是从0开始计数的。所以,这里要有一个转换。

ret[j++] = s[r+1] - s[l];

被减数和减数的下标都加一即可。下面是正确的代码: 

class Solution {
    String s = "aeiou";
    int judge(String str) {
        String head = str.charAt(0)+"";
        String rear = str.charAt(str.length()-1)+"";
        if(s.contains(head) && s.contains(rear)) {
            return 1;
        }
        return 0;
    }

    public int[] vowelStrings(String[] words, int[][] queries) {
        int n = words.length; //words 原数组
        int[] a = new int[n+10];    //words数组映射成前缀和数组
        for(int i = 1; i <= n; i++) {
            a[i] = judge(words[i-1]);
        }

        int[] s = new int[n+10];    //前缀和数组
        //初始化前缀和数组
        for(int i = 1; i <= n; i++) {
            s[i] = s[i-1] + a[i];
        }

        //求前缀和
        int[] ret = new int[queries.length];
        int k = 0;
        int j = 0;
        while(k < queries.length) {
            int l = queries[k][0];
            int r = queries[k][1];
            ret[j++] = s[r+1] - s[l];
            k++;

        }
        return ret;
    }
}

成功通过。头一次做到“不那么直白的”一维前缀和题目。还是很有收获的。 

 

记录一下 2023/6/2 晚上回宿舍的路。月亮其实是很好看的,可惜拍不出来。当时心情不错。 


http://lihuaxi.xjx100.cn/news/1202219.html

相关文章

计算机组成原理 第一章_概述

typora-copy-images-to: images 文章目录 typora-copy-images-to: images1.现代计算机的结构2.各硬件的工作原理2.1 主存储器的基本组成2.2 运算器的基本组成2.3 控制器的基本组成2.4 计算机的工作过程 3.计算机系统的层次结构4. 计算机的性能指标4.1存储器的性能指标4.2 CPU的…

银行转账问题(死锁)

本文主要讲述死锁的一个经典案例—银行转账问题&#xff0c;并对该问题进行定位、修复。 1. 问题说明 当账户A对账户B进行转账时&#xff0c; 首先需要获取到两把锁&#xff1a;账户A和账户B的锁。获取两把锁成功&#xff0c;且余额大于0&#xff0c;则扣除转出人的余额&…

【Python开发】FastAPI 05:表单与文件

类似之前的路径参数、查询参数和请求参数&#xff0c;表单与文件也可以算是请求参数中的一员&#xff0c;不过表单与文件更为特殊一些&#xff0c;表单是处理键值对数据、文件则是处理文件数据&#xff08;图片、音频、视频等文件&#xff09;。 目录 1 请求表单数据 1.1 表单…

I.MX RT1170加密启动详解(4):OTFAD XIP加密运行代码

本节将介绍基于AES加密的OTFAD引擎&#xff0c;它可以在不影响AES-128-CTR性能的情况下实时解密数据。OTFAD包括对AES密钥展开机制的完整硬件支持&#xff0c;它可以解密最多4个唯一的AES上下文。每个上下文都有一个用户定义的128位的Image Encryption Key(IEK)、一个64位的计数…

centos8安装部署Oracle Database Free

前言 centos8安装部署Oracle Database Free 安装部署 服务器安装 下载centos8镜像(选择镜像&#xff1a;CentOS-Stream-8-20230523.0-x86_64-dvd1.iso)并安装系统&#xff0c;具体细节不再赘述关闭centos8服务器的防火墙与selinux&#xff0c;并配置ip 部署oracle 注&…

用于ECharts的全国省市区县乡镇街道级的行政区划边界数据(GeoJSON格式)

https://map.vanbyte.com 提供了免费的省市县3级行政边界数据(GeoJSON格式)、省市县乡4级联动数据。 至于行政区划边界数据的来源&#xff0c;网络上有各种教程。授人以鱼不如授人以渔&#xff0c;下面记录一下各类方法的具体步骤。 来源1&#xff1a;阿里云的数据可视化平台…

编程的未来 - 还有未来么?

缘起 唐门教主上个月某天深夜写了一篇博客 --《编程的未来》&#xff0c;要我谈谈感想。 这也是最近软件工程师们聊得比较多的问题&#xff0c;上周&#xff0c;在上海的 “关东小磨” 和十多位 CSDN 博主聚会的时候&#xff0c;大家也稍微谈了一下这个话题&#xff0c;但是谈…

华为OD机试 - 数据最节约的备份方法(Java JS Python)

题目描述 有若干个文件,使用刻录光盘的方式进行备份,假设每张光盘的容量是500MB,求使用光盘最少的文件分布方式 所有文件的大小都是整数的MB,且不超过500MB;文件不能分割、分卷打包 输入描述 一组文件大小的数据 输出描述 使用光盘的数量 备注 不用考虑输入数据不合法…