2017-01-19 2 views
2

Я столкнулся с этим вопросом в одном из интервью, которые я посетил, и я в тупике.Как распечатать координаты из заданной строки?

Для ввода входной строки, такой как следующая, нам нужно напечатать координаты, полученные при последнем символе строки.

Направления:

L-Left 
U-Up 
R-Right 
D-Down 
X-Delete the previous move. 

Допущение:

start with the coordinates (0,0) 

Вот как рассчитать выход.

Учитывая вход:

3L5UR2DDX2LR 

Давайте сделаем шаг за шагом.

3L - Move 3 points to the left of (0,0) i.e (-3,0) 

5U- Move 5 points upper to (-3,0) i.e (-3,5) 

R - Move 1 point to the right of (-3,5) i.e (-2,5) 

2D - Move 2 points down to (-2,5) i.e (-2,3) 

D - Move 1 point further down i.e (-2,2) 

x - Delete the previous move.(current value is (-2,3)) 

2L -Move 2 left to (-2,3) i.e(-4,3) 

R- Move 1 Right to (-4,3) i.e (-3,3) 

Конечный выход (-3,3)

Я пытаюсь поставить его в коде, однако, я не получаю отправную точку, как сломать this.Any помощь будет высоко оценен ,

ответ

1

я хотел бы видеть проблему как признание сдвигает, каждый из которых имеет дополнительный фактор (сколько шагов) и в обязательном порядке направления. Когда коэффициент опущен, это фактически означает значение 1.

Таким образом, они могут быть представлены в виде шаблона в регулярном выражении:

String regex = "(?<factor>\\d*)" 
      + "(?<dir>[LURDX])"; 

Как только это будет сделано, нам просто нужно отобразить направление к соответствующим изменений в координатах (dx, dy), а затем примените изменения (умноженные на значение коэффициента) при обработке команд перемещения в цикле while регулярного выражения.

Обратите внимание, что X представляет собой особый случай, который может быть обработан всегда помнить последнее положение, как lastX и lastY.

Ниже моя реализация:

import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class Walk { 
    enum Move { 
     L (-1, 0) 
     , U (0, 1) 
     , R (1, 0) 
     , D (0, -1) 
     , X (0, 0) 
     ; 
     private int dx; 
     private int dy; 
     private Move(int dx, int dy) { 
      this.dx = dx; 
      this.dy = dy; 
     } 
     public int getDx() { 
      return dx; 
     } 
     public int getDy() { 
      return dy; 
     } 

    } 

    public static void main(String[] args) { 
     String input = "3L5UR2DDX2LR"; 
     String regex = "(?<factor>\\d*)" 
       + "(?<dir>[LURDX])"; 
     Pattern p = Pattern.compile(regex); 
     Matcher m = p.matcher(input); 
     int x = 0; 
     int y = 0; 
     int lastX = 0; 
     int lastY = 0; 
     while (m.find()) { 
      String factorString = m.group("factor"); 
      int factor; 
      if (factorString.length()==0) { 
       factor=1; 
      } else { 
       factor=Integer.parseInt(factorString); 
      } 
      String dirString = m.group("dir"); 
      Move move = Move.valueOf(dirString); 
      System.out.format("(%d,%d) last was (%d, %d) %d %s -> " 
        , x, y 
        , lastX, lastY 
        , factor, move.name()); 
      if (move==Move.X) { 
       x = lastX; 
       y = lastY; 
      } else { 
       lastX = x; 
       lastY = y; 
       x += factor * move.getDx(); 
       y += factor * move.getDy(); 
      }   
      System.out.format("(%d,%d)%n", x, y); 
     } 
     System.out.format("finally arrive at (%d,%d)%n", x, y); 

    } 

} 

Вывод этой программы заключается в следующем:

(0,0) last was (0, 0) 3 L -> (-3,0) 
(-3,0) last was (0, 0) 5 U -> (-3,5) 
(-3,5) last was (-3, 0) 1 R -> (-2,5) 
(-2,5) last was (-3, 5) 2 D -> (-2,3) 
(-2,3) last was (-2, 5) 1 D -> (-2,2) 
(-2,2) last was (-2, 3) 1 X -> (-2,3) 
(-2,3) last was (-2, 3) 2 L -> (-4,3) 
(-4,3) last was (-2, 3) 1 R -> (-3,3) 
finally arrive at (-3,3) 
2

Вы можете сделать следующее. Это алгоритм, который я бы использовал.

  1. Возьмите входную строку.
  2. Передайте его методу парсера, который возвращает массив токенов. Каждый токен начинается с числа и заканчивается буквой. Если две буквы следуют друг за другом, они считаются двумя разными токенами. X - независимый токен .
  3. Передайте массив токенов методу расчета, который возвращает окончательные координаты. В методе расчета прочитайте массив, возвращаемый в , пункт 2. После каждого токена прочитайте, выполните необходимую операцию по координатам.

Дизайн класса Координаты как. Это поможет вам легко решить вашу проблему.

public class Point { 

    private int x; 
    private int y; 

    public int getX() { 
     return x; 
    } 
    public void setX(int x) { 
     this.x = x; 
    } 
    public int getY() { 
     return y; 
    } 
    public void setY(int y) { 
     this.y = y; 
    } 

    public int modifyX(int xDiff){ 
     return (getX()+xDiff); 
    } 

    public int modifyY(int yDiff){ 
     return (getY()+yDiff); 
    } 

} 
Смежные вопросы