題目
874. 模擬行走機(jī)器人
分析
這道題就是個(gè)簡(jiǎn)單的模擬
主要有兩點(diǎn)考察點(diǎn):
- 對(duì)方向數(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):文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-599355.html
dx[0] //北方
dx[1] //東方
dx[2] //南方
dx[3] //西方
我們可以使用一個(gè)變量j
來(lái)指示當(dāng)前處于什么方向,j
始終只有0、1、2、3這四個(gè)取值,指示北、東、南、西四個(gè)方向,那么怎么實(shí)現(xiàn)j
在這三個(gè)取值之間來(lái)回有序切換呢?
我們可以利用去模運(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ù)對(duì)正數(shù)去模,還是負(fù)數(shù),就出了范圍,這里我們通過(guò)加上一個(gè)模數(shù)4的倍數(shù),來(lái)使結(jié)果始終為正數(shù)。
因此,我們總結(jié)轉(zhuǎn)向操作的實(shí)現(xiàn):文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-599355.html
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è)對(duì)象的引用地址,即它們是否指向同一個(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)前位置 初始為0
int 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{ //能走,則走,且在走的過(guò)程中把最大歐氏距離的平方更新
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]);
}
}
到了這里,關(guān)于暑期代碼每日一練Day3:874. 模擬行走機(jī)器人的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!