JavaScript PAT乙级题解 1040 有几个PAT

文章讲述了作者解决一个编程问题的过程,涉及查找PAT子串的数量,初始使用三重循环但超时,后优化为双重for循环并遇到findIndex方法限制。最终采用更高效的方法统计A前P和后T的数量来计算PAT组合数。
摘要由CSDN通过智能技术生成


字符串 APPAPT 中包含了两个单词 PAT,其中第一个 PAT 是第 2 位§,第 4 位(A),第 6 位(T);第二个 PAT 是第 3 位§,第 4 位(A),第 6 位(T)。

现给定字符串,问一共可以形成多少个 PAT?

输入格式:

输入只有一行,包含一个字符串,长度不超过105,只包含 P、A、T 三种字母。

输出格式:

在一行中输出给定字符串中包含多少个 PAT。由于结果可能比较大,只输出对 1000000007 取余数的结果。

输入样例:

APPAPT

输出样例:

2

题解如下:

25/25

这题最开始的思路是三重for循环,就挨个找这个字母后面有几个对应的字母,跑了一下后3个case超时,就优化了一下代码改成了双重for循环,但是还是超时

看了一下网上的思路,发现找出每个A前面的P的数量和后面的T的数量然后相乘就好了

然后又开始捣鼓,想着用findIndexfindLastIndex分别计算出字母数量,但是findLastIndex会报错findLastIndex is not a function,查文档得知:我用的node进行编译,但是这个方法对node版本要求比较高,得18.0.0以上,而pat的node版本也才12。又get了新知识捏

但是其实就算是findIndex也行不通,还是超时,我猜这一类方法的底层实现应该都是遍历,会导致时间复杂度比较高

因此还是学习了网上的方法,我真的蛮笨的,咋就想不出来呢?

以上都是废话,正文如下:

/**
 * 2024/03/18
 * 25/25
 */
const readline = require("readline");
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

rl.on("line", function (data) {
  console.log(deal(data));
});

function deal(data) {
  let num = 0;
  // findLastIndex方法对node版本要求必须是18.0.0以上,否则会报错
  // 所以就换成findIndex找到第一个比A大的索引,该索引前面的所有都是比A小的索引了,不过find系列的方法的底层实现原理好像都是遍历,时间复杂度会过大无法通过
  // 统计字母T的数量
  let TNum = 0;
  let PNum = 0;
  for (let i = 0; i < data.length; i++) {
    if (data[i] === "T") {
      TNum++;
    }
  }
  for (let i = 0; i < data.length; i++) {
    let el = data[i];
    if (el === "P") {
      PNum++;
    } else if (el === "T") {
      TNum--;
    } else {
      num += (PNum * TNum) % 1000000007;
    }
  }
  return num % 1000000007;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值