Лучшее решение для композиции поезда
Недавно я ответил на тест "Мой онлайн-интервью", в котором меня попросили следующий вопрос
Конструкция TrainComposition строится путем крепления и отсоединения вагонов с левой и правой сторон.
Например, если мы начнем с прикрепления вагона 7 слева, а затем с помощью вагона 13, снова слева, мы получим композицию из двух вагонов (13 и 7 слева направо). Теперь первый вагон, который может быть отделен от правой, равен 7, а первый, который можно отделить слева, - 13. Внедрить TrainComposition, который моделирует эту проблему.
Я использовал дважды связанный список для решения проблемы
class Node
{
protected int data;
protected Node next, prev;
/* Constructor */
public Node()
{
next = null;
prev = null;
data = 0;
}
/* Constructor */
public Node(int d, Node n, Node p)
{
data = d;
next = n;
prev = p;
}
/* Function to set link to next node */
public void setLinkNext(Node n) {
next = n;
}
/* Function to set link to previous node */
public void setLinkPrev(Node p) {
prev = p;
}
/* Funtion to get link to next node */
public Node getLinkNext() {
return next;
}
/* Function to get link to previous node */
public Node getLinkPrev() {
return prev;
}
/* Function to set data to node */
public void setData(int d) {
data = d;
}
/* Function to get data from node */
public int getData() {
return data;
}
}
public class SortedSearch {
protected Node start;
protected Node end;
public int size;
/* Constructor */
public SortedSearch()
{
start = null;
end = null;
size = 0;
}
public boolean isEmpty()
{
return start == null;
}
public int getSize()
{
return size;
}
public void attachWagonFromLeft(int wagonId) {
Node nptr = new Node(wagonId, null, null);
if (start == null)
{
start = nptr;
end = start;
}
else
{
start.setLinkPrev(nptr);
nptr.setLinkNext(start);
start = nptr;
}
size++;
}
public void attachWagonFromRight(int wagonId) {
Node nptr = new Node(wagonId, null, null);
if (start == null)
{
start = nptr;
end = start;
}
else
{
nptr.setLinkPrev(end);
end.setLinkNext(nptr);
end = nptr;
}
size++;
}
public int detachWagonFromLeft() {
int value=0;
if (size == 1)
{
value = start.getData();
start = null;
end = null;
size = 0;
return value;
}
value = start.getData();
start = start.getLinkNext();
start.setLinkPrev(null);
size--;
return value;
}
public int detachWagonFromRight() {
int value=0;
value = end.getData();
end = end.getLinkPrev();
end.setLinkNext(null);
size-- ;
return value;
}
public static void main(String[] args) {
SortedSearch tree = new SortedSearch();
tree.attachWagonFromLeft(7);
tree.attachWagonFromLeft(13);
tree.attachWagonFromLeft(12);
tree.attachWagonFromLeft(10);
tree.attachWagonFromLeft(6);
tree.attachWagonFromLeft(4);
tree.attachWagonFromLeft(3);
tree.attachWagonFromLeft(2);
System.out.println(tree.detachWagonFromRight()); // 7
System.out.println(tree.detachWagonFromRight()); // 13
System.out.println(tree.detachWagonFromRight()); // 7
System.out.println(tree.detachWagonFromRight()); // 13
System.out.println(tree.detachWagonFromRight()); // 7
System.out.println(tree.detachWagonFromRight()); // 13
}
}
И протестировал его соответственно. Но когда он был представлен, он сказал, что не удалось выполнить внутренние тестовые примеры, и ответ был помечен неправильно.
Не могли бы вы рассказать, что является лучшим решением для этой проблемы.
Ответы
Ответ 1
Почему бы просто не использовать эту простую реализацию?
private static class TrainComposition {
private final Deque<Integer> wagons = new LinkedList<>();
public void attachLeft(int wagonNumber) {
wagons.addFirst(wagonNumber);
}
public void attachRight(int wagonNumber) {
wagons.addLast(wagonNumber);
}
public void detachLeft() {
if (!wagons.isEmpty()) {
wagons.removeFirst(); // Alternative if exception should not be bubbled up: wagons.pollFirst()
} else {
throw new IndexOutOfBoundsException("No wagons available");
}
}
public void detachRight() {
if (!wagons.isEmpty()) {
wagons.removeLast(); // Alternative if exception should not be bubbled up: wagons.pollLast()
} else {
throw new IndexOutOfBoundsException("No wagons available");
}
}
}
Ответ 2
Кажется, что в detachWagonFromRight
отсутствует проверка, что detachWagonFromLeft
имеет:
public int detachWagonFromLeft() {
int value=0;
if (size == 1)
{
value = start.getData();
start = null;
end = null;
size = 0;
return value;
}
value = start.getData();
start = start.getLinkNext();
start.setLinkPrev(null);
size--;
return value;
}
public int detachWagonFromRight() {
int value=0;
value = end.getData();
end = end.getLinkPrev();
end.setLinkNext(null);
size-- ;
return value;
}
Итак, когда вы удаляете последний вагон с правой стороны, start
все еще указывает на него
Ответ 3
Выглядит немного "долго", ваше решение. Я бы определил объект, называемый "поезд", который имеет объект .value = number_of_wagons (список). Затем определите 2 метода:
- train.attach(сайт, номер): с помощью команды append или команды insert для присоединения нового номера с нужной стороны
- train.detach(site): удаление элемента списка и, возможно, печать номера.
Однако, для моего понимания (также описание проблемы не очень детализировано, поэтому я не знаю, какой должен быть ожидаемый ответ), вы можете прикреплять вагоны только с одной стороны, поскольку движок находится на другом);)
Ответ 4
import java.util.*;
public class TrainComposition {
LinkedList<Integer> wagons = new LinkedList<Integer>();
public static void main(String[] args) {
TrainComposition tree = new TrainComposition();
tree.attachWagonFromLeft(7);
tree.attachWagonFromLeft(13);
System.out.println(tree.detachWagonFromRight()); // 7
System.out.println(tree.detachWagonFromLeft()); // 13
}
public void attachWagonFromLeft(int wagonId) {
wagons.addFirst(wagonId);
// throw new UnsupportedOperationException("Waiting to be implemented.");
}
public void attachWagonFromRight(int wagonId) {
wagons.addLast(wagonId);
// throw new UnsupportedOperationException("Waiting to be implemented.");
}
public int detachWagonFromLeft() {
if (!wagons.isEmpty()) {
return wagons.removeFirst();
} else {
throw new IndexOutOfBoundsException("No wagons available");
}
}
public int detachWagonFromRight() {
if (!wagons.isEmpty()) {
return wagons.removeLast();
} else {
throw new IndexOutOfBoundsException("No wagons available");
}
}