题目分析
小明同学正在学习一种新的语言。在该语言中,如果出现了一次wa或者一次aw,则代表出现了一个警告。如果出现了连续的wa或者连续的aw,则代表出现了一个错误。小明由于学习比较粗心,所以他想要知道自己刚刚写完的作业中一共出现了多少处警告和错误。下面是小明刚刚写完的作业,请你帮助小明找到他一共出现了多少次警告和多少次错误。
分析题目:仔细读题,明确要求的是两个量,一个是警告,一个是错误。
大致思路:
1.定义两个变量分别为警告次数和错误次数
2.遍历作业经判断确定是警告次数增加还是错误次数增加
动手解题
祖传开头
public class Main { }
将题目所给大量文本内容复制出来,查看数据所有内容,并赋值给字符串s
static String s = “iawaswapwa…….eyiwe”;
新建一个新的空栈
Public static void main(String[] args){ Stack<Character> stk = new Stack<Character>() ;
创建两个变量
int ansl=0,ans2=0;
写一个for循环遍历每一个数,准备开始干大事
for (int i = 0; i < s.length(); i++) {… }
判断内容仅为w和a的组合,在栈为空时,无关元素直接忽略
仅当遍历到a或w时,push入栈
if ( stk.empty( ) ) { if (s.charAt(i) == 'a' || s.charAt(i) == 'w') { stk.push(s.charAt(i)); } }
若栈内不为空,则根据栈顶元素判断是否push下一个元素进栈
即:若栈顶元素为w,遍历的下一个元素为a,则将下一个元素push进栈
else { char now = stk.peek(); if (now == 'w') { if (s.charAt(i) == 'a') { stk.push(s.charAt(i)); }
若栈顶元素为w,遍历的下一个元素仍为w,则i–,否则该w将被跳过
else { if (s.charAt(i) == 'w') { i--; }
连续两次出现w,并执行i—后,判断此时栈的长度
若为2或3,则栈内为aw或wa或awa或waw
警告+1
若大于3,则栈内必定为重复的aw或wa
错误+1
确定当前栈内字段为警告还是错误,并为相应变量+1后
清空栈,继续遍历后续元素
if (stk.size() == 2 || stk.size() == 3) { ans1++; } else if (stk.size() > 3) { ans2++; } stk.clear(); } }
当第一个元素为a时同理有
else if (now == 'a') { if (s.charAt(i) == 'w') { stk.push(s.charAt(i)); } else { if (s.charAt(i) == 'a') { i--; } if (stk.size() == 2 || stk.size() == 3) { ans1++; } else if (stk.size() > 3) { ans2++; } stk.clear(); } }
如果最后的字段仍为重复的aw或wa则不会增加相应的警告或错误数量,有可能会导致错误或警告的数量少一个。故需要判断最后栈内剩下的元素数。
判断最后栈内剩下的元素数,并相应增加警告或错误数
} } if (stk.size() == 2 || stk.size() == 3) { ans1++; } else if (stk.size() > 3) { ans2++; }
最后输出要求的值,注意不要有多余输出
System.out.println(ans1); System.out.println(ans2); } }