Day53小球走过距离和自动判定程序

137 阅读3分钟

Day03 2023/03/01

难度:中等

题目1

一个小球从10处落下,每次的弹回之前的高度一半,请问小球在静止之前一共走过多少距离?

题目一:

static float high(float high){
    float ans = 0;
    while (high != 0){
        ans += high + high / 2;
        high = high / 2;
    }
    return ans;
}
  • 时间复杂度 O(n)--- n为最终循环的次数
  • 空间复杂度 O(1)--- 仅有常数级的变量,没有额外的辅助空间

题目2

“答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于PAT的“答案正确”大派送——只要读入的字符串满足下列条件,系统就输出"“答案正确”,否则输出“答案错误”。

得到“答案正确”的条件是:

1.字符串中必须仅有P、A、T这三种字符,不可以包含其它字符;

2.任意形如xPATx的字符串都可以获得“答案正确”,其中x或者是空字符串,或者是仅由字母A组成的字符串:

3.如果aPbTc是正确的,那么aPbATca也是正确的,其中a、b、c均或者是空字符串,或者是仅由字母A组成的字符串。

现在就请你为PAT写一个自动裁判程序,判定哪些字符串是可以获得“答案正确”的。

输入格式:

每个测试输入包含1个测试用例。第1给出一个正整数n(≤10),是需要检测的字符串个数。接下来每个字符串占一行,字符串长度不超过100,且不包含空格。

输出格式:

每个字符串的检测结果占一行,如果该字符串可以获得“答案正确”,则输出YES,否则输出NO

(用例给的结果经过测试全部正确,为了避免审核过久,就不放图了)

思路:

1.先初始化辅助数组PAT把它们的值都置为-1,利用辅助数组记录P和T第一次出现的下标
  置为-1的原因是为了后面出现多次P仍然记录的是第一次p的下标
2.若没出现P和T则直接return false;
3.截取题目所求的a,b,c;
4.判断是否符合xPATx的要求,若符合直接返回true;
5.若b的长度>1,则中了“aPbATca”这个逻辑,须按照规则重新截取b,c(a不变),重新判断;

题目二:

static boolean PAT(String word){    
//  先初始化辅助数组PAT把它们的值都置为-1,利用辅助数组记录P和T第一次出现的下标
      置为-1的原因是为了后面出现多次P仍然记录的是第一次p的下标
      int PAT[] = new int[2];
      for (int i = 0; i < 2; i++){
          PAT[i] = -1;
      }
      for (int i = 0;i < word.length();i++){
          if (PAT[0] == -1)
          PAT[0] = word.charAt(i) == 'P' ? i : -1;
          if (PAT[1] == -1)
          PAT[1] = word.charAt(i) == 'T' ? i : -1;
      }
      
      // 2.若没出现P和T则直接return false;
      if (PAT[0] == -1 || PAT[1] == -1)return false;\
      
      // 3.截取题目所求的a,b,c;
       String a,b,c;
      a = word.substring(0,PAT[0]);
      b = word.substring(PAT[0]+1,PAT[1]);
      c = word.substring(PAT[1]+1,word.length());
      
      //4.判断是否符合xPATx的要求,若符合直接返回true;
      if (text(a,b,c)){
          return true;
      }
      
      //5.若b的长度>1,则中了“aPbATca”这个逻辑,须按照规则重新截取b,c(a不变),重新判断;
      if (b.length() > 1)
      {
          b = word.substring(PAT[0]+1,PAT[1]-1);
          c = word.substring(PAT[1]+1,word.length()-a.length());
          if (text(a,b,c))return true;
      }
      return false;
  }
  
  //按照题目所给规则的判断函数
  static boolean text(String a,String b,String c){
      if (!b.equals("A"))return false;
      for (int i = 0;i < a.length();i++){
          if (a.charAt(i) != 'A' && a.charAt(i) != ' ')return false;
      }
      for (int i = 0;i < c.length();i++){
          if (c.charAt(i) != 'A' && c.charAt(i) != ' ')return false;
      }
      return true;
  }
  • 时间复杂度 O(n∗m)--- 外层循环n次,内层每次判断一个字符最坏情况下循环m次,其中n为字符串个数,m为字符串长度
  • 空间复杂度 O(1)--- 仅有常数级的变量,没有额外的辅助空间