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