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)--- 仅有常数级的变量,没有额外的辅助空间