中文標題【機器人移動】java
這個題目是 Kayak 發佈的代碼挑戰題目。git
我認爲題目自己描述的不是十分清楚,方法須要返回結果,可是結果沒有說明是機器人最後的座標位置,仍是最後的座標位置距離原點的距離。同時,機器人的初始化方向等都沒有十分明確的定義。github
根據測試數據,機器人應該是從下往上(初始化的方向)。由於若是初始化的方向不肯定的話,最後的座標值可能會不一致。算法
我這裏假設程序應該返回的是機器人的最後座標位置,而且初始化的位置爲 (0,0),方向爲從下往上。數組
A robot lands on Mars, which happens to be a cartesian grid; assuming that we hand the robot these instructions, such as LFFFRFFFRRFFF, where "L" is a "turn 90 degrees left", "R" is a "turn 90 degrees right", and "F" is "go forward one space。app
please write control code for the robot such that it ends up at the appropriate-and-correct destination, and include unit tests.測試
Here is an example output with command "FF":spa
[0, 2]翻譯
這裏我不按照原文一字一字的翻譯,可是儘可能按照題目的要求把題目解釋清楚。debug
這裏題目的要求是,假設一個機器人降落到火星上了,咱們如今須要給機器人發佈指令。指令包括有 L,R,F 3 個。
L 表示的意思是機器人向左轉 90 度,R 的意思表示的是機器人向右轉 90 度,F 表示的是機器人向前移動一個座標單位。
題目的表達並是是十分明確也清晰,好比說 LFFFRFFFRRFFF 應該返回是什麼沒有說清楚。假設 指令 FF ,返回的結果是 [0, 2],我默認的是程序須要返回機器人最後的座標位置,0 表示的是 X 座標,2 表示的是 Y 座標。
這個問題的思路,首先你須要明白幾個點。若是須要進行座標計算的話,請注意 L 和 F 是不會改變當前機器人的座標位置的。
只有 F 的操做纔會改變機器人的位置。考慮設置一個座標系,那麼這裏須要存儲 2 個信息,第一個信息爲 F 移動時候機器人的位置,另外就是 L 和 F 對機器人方向的控制了。
因此你須要在程序中初始化一個二維數組,這個數組用於存儲 F 操做時候的座標變化。
同時你還須要存儲一個 dir 變量,一般這個變量爲每一次 L 和 R 操做的時候方向的變化。
F 存儲的路徑數組爲:int[][] move = { { 0, 1 }, { 1, 0 }, { 0, -1 }, { -1, 0 } };
經過這個數組,你就明白爲何我在這個 WIKI 頁面前面說的,初始化方向很重要,請參考下面的圖(由於不太好用計算機畫圖,咱們用手畫了一個圖)。
在這個圖中比較明確的說明了,咱們定義的初始化方向爲從下往上,Dir 等於 0 。在 Dir 等於 0 的時候座標數組爲 int[][] move = { { 0, 1 }, { 1, 0 }, { 0, -1 }, { -1, 0 } }; 按照順時針的方向。
在圖中,Dir 有 4 個反向,按照順時針方向,分別爲上,右,下,左,那麼方向對應的值就分別爲 0,1,2,3 。
當方向爲 L 的時候,須要將方向值減 1 ,當方向爲 R 的時候,須要將值 +1。
這裏有個問題爲循環,好比說,方向值爲 RR,,dir 的值應該爲 2。
若是方向爲 RRRRRR,那麼值應該也爲 2。因此在算法中咱們使用了 dir = (dir + 4) % 4;, 對方向進行取 餘數。你能夠看到 當你旋轉 RRRRRR 後,dir 的值仍是爲 2。
針一次轉向 + 移動的操做,無論你轉向多少次,調整的方方向無非就是調整 X 或者 Y 的座標系,在下一次移動的時候應該是 + 仍是 -
因此到這裏方法就相對簡單了。一次移動的時候,都會改變 X 和 Y 座標的值,前提是你是但願怎麼加減而已。
源代碼和有關代碼的更新請訪問 GitHub:
測試類請參考:
代碼思路請參考:
package com.ossez.codebank.interview; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * https://www.cwiki.us/display/ITCLASSIFICATION/Robot+Movement * * @author YuCheng * */ public class KayakRobotMovement { private final static Logger logger = LoggerFactory.getLogger(KayakRobotMovement.class); /** * Get coordinates for Robot Movement * * @param data * @return */ public static String getCoordinates(String data) { logger.debug("BEGIN"); String retStr = ""; int x = 0; int y = 0; int[][] move = { { 0, 1 }, { 1, 0 }, { 0, -1 }, { -1, 0 } }; int dir = 0; for (char ch : data.toCharArray()) { if (ch == 'F') { x += move[dir][0]; y += move[dir][1]; } else if (ch == 'L') { dir--; } else if (ch == 'R') { dir++; } dir = (dir + 4) % 4; } retStr = x + "," + y; return retStr; } }
上面程序的測試結果以下:
2018/12/25 15:08:50 DEBUG [com.ossez.codebank.interview.tests.KayakTest] - LFFF - [0,2]
2018/12/25 15:08:50 DEBUG [com.ossez.codebank.interview.tests.KayakTest] - LFFFRFFFRRFFF - [-3,0]
https://www.cwiki.us/display/ITCLASSIFICATION/Robot+Movement