網(wǎng)站設(shè)計機(jī)構(gòu)文檔在線制作網(wǎng)站免費
題目
874. 模擬行走機(jī)器人
分析
這道題就是個簡單的模擬
主要有兩點考察點:
- 對方向數(shù)組的運用
方向數(shù)組存儲的是各個方向的單位向量,也即:
方向 | X | Y |
---|---|---|
向北 | 0 | 1 |
向東 | 1 | 0 |
向南 | 0 | -1 |
向西 | -1 | 0 |
存儲在數(shù)組中,則是方向數(shù)組:
int[] dx = {0, 1, 0, -1};
int[] dy = {1, 0, -1, 0};
我們很容易發(fā)現(xiàn):
dx[0] //北方
dx[1] //東方
dx[2] //南方
dx[3] //西方
我們可以使用一個變量j
來指示當(dāng)前處于什么方向,j
始終只有0、1、2、3這四個取值,指示北、東、南、西四個方向,那么怎么實現(xiàn)j
在這三個取值之間來回有序切換呢?
我們可以利用去模運算,假設(shè)我們初始面向北方,即j
為0,那么當(dāng)我們想向左轉(zhuǎn)的時候,是面向西方,則j
要相應(yīng)的變?yōu)?,這時,我們進(jìn)行的操作是(j-1+4)%4
,為什么還要+4
呢?因為負(fù)數(shù)對正數(shù)去模,還是負(fù)數(shù),就出了范圍,這里我們通過加上一個模數(shù)4的倍數(shù),來使結(jié)果始終為正數(shù)。
因此,我們總結(jié)轉(zhuǎn)向操作的實現(xiàn):
j = (j-1+4)%4; // 左轉(zhuǎn)
j = (j+1+4)%4; // 右轉(zhuǎn)
- 怎么實現(xiàn)快速判斷當(dāng)前點是否在障礙物點集中
這里我們可以利用HashSet
把障礙物點以String
字符串的形式存放在HashSet
中。
在Java中,如果您在HashSet
中存放字符串,那么每次調(diào)用contains
方法,底層判斷兩個字符串相等與否時,調(diào)用的是equals
方法而不是==
運算符。
這是因為==
運算符比較的是兩個對象的引用地址,即它們是否指向同一個內(nèi)存地址。而String
類重寫了equals
方法,比較的是兩個字符串的內(nèi)容是否相等,而不是它們的引用地址。
代碼
class Solution {public int robotSim(int[] commands, int[][] obstacles) {// 設(shè)置方向數(shù)組 初始為y軸方向 往大是向右轉(zhuǎn),往小是向左轉(zhuǎn)int[] dx = {0, 1, 0, -1};int[] dy = {1, 0, -1, 0};int cur_x = 0,cur_y = 0; // 當(dāng)前位置 初始為0int max_dis = 0; // 最大歐氏距離// 創(chuàng)建一個障礙物點集PointSet pointSet = new PointSet(obstacles);int j = 0; //控制方向 始終在0 1 2 3的范圍內(nèi)for(int i=0;i<commands.length;i++){int op = commands[i];if(op>=1&&op<=9){int[] point = new int[2]; //下一步試探點while(op>0){point[0] = cur_x+dx[j];point[1] = cur_y+dy[j];//試探下一步能不能走if(pointSet.contains(point)) //被建筑物擋住不能走break;else{ //能走,則走,且在走的過程中把最大歐氏距離的平方更新cur_x = cur_x+dx[j];cur_y = cur_y+dy[j];max_dis = Math.max(max_dis,cur_x*cur_x+cur_y*cur_y);}op--;}}else if(op==-2){j = (j-1+4)%4; // 左轉(zhuǎn)continue;}else if(op==-1){j = (j+1+4)%4; // 右轉(zhuǎn)continue;}}return max_dis;}
}
//哈希set 高效判斷該點是否存在
public class PointSet {private HashSet<String> pointSet;// 構(gòu)造函數(shù) 參數(shù)是一個二維點集public PointSet(int[][] points) {pointSet = new HashSet<>();// 把點集中的點都加進(jìn)去for (int[] point : points) {pointSet.add(point[0] + "," + point[1]); //以字符串形式存儲}}public boolean contains(int[] point) {return pointSet.contains(point[0] + "," + point[1]);}
}