1.机器人能否返回原点(657)
题目描述:
在二维平面上,有一个机器人从原点 (0, 0) 开始。给出它的移动顺序,判断这个机器人在完成移动后是否在 (0, 0) 处结束。
移动顺序由字符串 moves 表示。字符 move[i] 表示其第 i 次移动。机器人的有效动作有 R(右),L(左),U(上)和 D(下)。
如果机器人在完成所有动作后返回原点,则返回 true。否则,返回 false。
注意:机器人“面朝”的方向无关紧要。 “R” 将始终使机器人向右移动一次,“L” 将始终向左移动等。此外,假设每次移动机器人的移动幅度相同。
思路: 这题比较简单,只需要遍历移动字符串然后判断如果向左和向右,向上和向下的字符个数相等即可。
代码:
class Solution {
public boolean judgeCircle(String moves) {
int countR=0,countL=0,countU=0,countD=0;
for(char c : moves.toCharArray()) {
switch(c) {
case 'R':
countR++;
break;
case 'L':
countL++;
break;
case 'U':
countU++;
break;
case 'D':
countD++;
break;
}
}
if(countD==countU && countR==countL) {
return true;
}
return false;
}
}
2.找出井字棋的获胜者(1275)
题目描述:
A 和 B 在一个 3 x 3 的网格上玩井字棋。
井字棋游戏的规则如下:
玩家轮流将棋子放在空方格 (" ") 上。
第一个玩家 A 总是用 “X” 作为棋子,而第二个玩家 B 总是用 “O” 作为棋子。
“X” 和 “O” 只能放在空方格中,而不能放在已经被占用的方格上。
只要有 3 个相同的(非空)棋子排成一条直线(行、列、对角线)时,游戏结束。
如果所有方块都放满棋子(不为空),游戏也会结束。
游戏结束后,棋子无法再进行任何移动。
给你一个数组 moves,其中每个元素是大小为 2 的另一个数组(元素分别对应网格的行和列),它按照 A 和 B 的行动顺序(先 A 后 B)记录了两人各自的棋子位置。
如果游戏存在获胜者(A 或 B),就返回该游戏的获胜者;如果游戏以平局结束,则返回 “Draw”;如果仍会有行动(游戏未结束),则返回 “Pending”。
你可以假设 moves 都 有效(遵循井字棋规则),网格最初是空的,A 将先行动。
思路: 首先定义一个二位数组作为棋盘,然后根据A和B的下棋顺序以及给出的下棋位置的数组逐步向定义的二维数组也就是棋盘中添加字符,添加完成后判断两个对角线以及每一行每一列是否有成功的,如果有直接返回字符。如果没有并且棋盘装满了那么返回平局,如果没有并且棋盘未满就返回仍会有行动。
代码:
class Solution {
public String tictactoe(int[][] moves) {
String[][] board=new String[3][3];
for(int i=0;i<moves.length;i++) {
if(i%2==0) {
board[moves[i][0]][moves[i][1]]="A";
} else {
board[moves[i][0]][moves[i][1]]="B";
}
}
if(board[0][0]!=null&&board[1][1]==board[0][0]&board[0][0]==board[2][2]) {
return board[0][0];
}
if(board[1][1]!=null&&board[2][0]==board[1][1]&board[1][1]==board[0][2]) {
return board[1][1];
}
for(int j=0;j<3;j++) {
if(board[j][1]!=null&&board[j][0]==board[j][1]&&board[j][1]==board[j][2]) {
return board[j][0];
} else if(board[1][j]!=null&&board[0][j]==board[1][j]&&board[1][j]==board[2][j]) {
return board[0][j];
}
}
if(moves.length==9) {
return "Draw";
}
return "Pending";
}
}
3.困于环中的机器人(1041)
题目描述:
在无限的平面上,机器人最初位于 (0, 0) 处,面朝北方。注意:
北方向 是y轴的正方向。
南方向 是y轴的负方向。
东方向 是x轴的正方向。
西方向 是x轴的负方向。
机器人可以接受下列三条指令之一:
“G”:直走 1 个单位
“L”:左转 90 度
“R”:右转 90 度
机器人按顺序执行指令 instructions,并一直重复它们。
只有在平面中存在环使得机器人永远无法离开时,返回 true。否则,返回 false。
思路: 题目这里分两种情况。第一种就是遍历完instructions字符串中的操作后位置回到(0,0),对于这种情况先设置一个长度为2的数组表示坐标再设置一个整形变量direct表示方向(direct初始值为0表示北),然后设置一个for循环遍历字符,如果遍历到字符L就将direct+3,如果遍历到字符R将direct+1(这里这样操作是因为按照北->东->南->西这样的顺序来的),接着如果遍历到G字符就在相应方向加一,例如direct此时等于0,那么y轴坐标加一,这样遍历完成后如果坐标还是(0,0)就返回true。第二种情况就是一遍遍历回不到(0,0),需要遍历多遍,这种情况力扣里面的题解写的挺好的,这里贴出来。
由此可得当遍历完一遍后,方向direct不为0时后边遍历多遍就能回到原点。
代码:
class Solution {
public boolean isRobotBounded(String instructions) {
int x=0;
int y=0;
int direct=0;
int[] arr=new int[2];
for(char c:instructions.toCharArray()) {
if(c=='G') {
switch(direct%4) {
case 0:
arr[1]+=1;
break;
case 1:
arr[0]+=1;
break;
case 2:
arr[1]-=1;
break;
case 3:
arr[0]-=1;
break;
}
} else if(c=='L') {
direct+=3;
} else {
direct+=1;
}
}
if((arr[0]==0&&arr[1]==0) || direct%4!=0) {
return true;
}
return false;
}
}