1.第一题
1.1题目
描述:
Emacs号称神的编辑器,它自带了一个计算器。与其他计算器不同,它是基于后缀表达式的,即运算符在操作数的后面。例如“2 3 +”等价于中缀表达式的“2 + 3”。
请你实现一个后缀表达式的计算器
输入描述:
输入包含多组数据
每组数据包括两行:第一行是一个正整数n (3≤n≤50);紧接着第二行包含n个由数值和运算符组成的列表
“±*/”分别为加减乘除四则运算,其中除法为整除,即“5/3=1”
输出描述:
对应每一组数据,输出它们的运算结果
1.2思路
- 如果是运算符,就取出栈顶的两个元素进行计算
- 如果不是运算符,就将该值放入栈中
1.3解题
import java.util.*;
public class Main {
// 求逆波兰表达式的值(后缀表达式)
public static int evalIRPN(String[] str){
Stack<Integer> stack = new Stack<>();
for(String s : str){
if(isOperation(s)){
// 如果是运算符,就取出栈顶的两个元素进行计算
int num2 = stack.pop();
int num1 = stack.pop();
switch(s){
case "+":
stack.push(num1 + num2);
break;
case "-":
stack.push(num1 - num2);
break;
case "*":
stack.push(num1 * num2);
break;
case "/":
stack.push(num1 / num2);
break;
}
}else{
// 如果不是运算符,就将该值放入栈中
stack.push(Integer.parseInt(s));
}
}
// 最后栈中的元素的值就是逆波兰表达式的值
return stack.pop();
}
// 判断该字符串是不是运算符
public static boolean isOperation(String s){
if(s.equals("+")||s.equals("-")||s.equals("*")||s.equals("/")){
return true;
}
return false;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(sc.hasNext()){
int n = sc.nextInt();
sc.nextLine();
String[] str = new String[n];
for(int i = 0;i < n;i++){
str[i] = sc.next();
}
System.out.println(evalIRPN(str));
}
}
}
2.第二题
2.1题目
描述:
NowCoder最近爱上了五子棋,现在给你一个棋局,请你帮忙判断其中有没有五子连珠(超过五颗也算)
输入描述:
输入有多组数据,每组数据为一张20x20的棋盘。
其中黑子用“*”表示,白子用“+”表示,空白位置用“.”表示
输出描述:
如果棋盘上存在五子连珠(无论哪种颜色的棋子),输入“Yes”,否则输出“No”
2.2思路
- 以当前位置为中心,统计四个大的方向上的棋子的个数
- 如果超过五个棋子连成线就返回true
2.3解题
import java.util.*;
public class Main {
public static final int N = 20;
// 统计该位置各个方向连成线的个数
public static int count(char[][] map,char ch,int x,int y){
int[][][] direct = {
{{0,-1},{0,1}},//左右
{{1,0},{-1,0}},//上下
{{-1,-1},{1,1}},//左上右下
{{-1,1},{1,-1}},//右上左下
};
int maxCount = 0;
// 四个方向,两种棋子
for(int i = 0;i < 4;i++){
int sum = 0;
for(int j = 0;j < 2;j++){
int nx = x;
int ny = y;
while(nx >= 0 && nx < N && ny >= 0 && ny < N && map[nx][ny] == ch){
sum++;
nx += direct[i][j][0];
ny += direct[i][j][1];
}
}
maxCount = Math.max(sum,maxCount);
}
return maxCount - 1;
}
// 判断是否超过五个棋子连珠
public static boolean sever(char[][] map){
for(int i = 0;i < N ;i++){
for(int j = 0;j < N ;j++){
if(map[i][j] == '*' || map[i][j] == '+'){
if(count(map,map[i][j],i,j) >= 5){
return true;
}
}
}
}
return false;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(sc.hasNext()){
char[][] map = new char[N][N];
for(int i = 0;i < N;i++){
map[i] = sc.nextLine().toCharArray();
}
System.out.println(sever(map)? "Yes":"No");
}
}
}