как найти хорошее решение или оптимизировать решение - PullRequest
0 голосов
/ 01 апреля 2019

Меня взяла интервью у компании, и меня попросили написать код для каждого из следующих вопросов. Я закончил свой код менее чем за 15 минут. Через несколько дней я получил сообщение о том, что они решили продолжить работу с другими кандидатами. Я не могу придумать лучшего решения, чтобы ответить на эти вопросы. Я ценю, если вы можете помочь мне лучше понять, почему мое решение не было достаточно хорошим и как я могу его улучшить.

Queston: Допустим, у нас есть поток целых чисел (очень большой список). Что-то вроде: 1, 2, 7, 3, 9, 4, 1, 2, 5, ..., -1. Последний элемент в потоке всегда равен -1. Функция int read () возвращает следующий элемент из потока, и нет другого способа чтения из этого потока.

  • Напишите метод, int [] last5 () , который возвращает последние 5 элементов из потока.
  • Напишите метод int [] last5unique () , который возвращает последние 5 уникальных элементов, отсортированных по последнему вхождению (позиции) в потоке. Например, поток: 1 2 3 2 4 5 последние 5 отсортированы по вхождению: 1 3 2 4 5. Обратите внимание, что позиция последних 2 больше, чем позиция последних 3.

и я придумал следующее

public int[] last5() {

  int[] toReturn = new int[5];

  int last = read(); 
  int counter = 0; 
  toReturn[counter] = last; 
  counter++; 

  while (last != -1) {
    last = read(); 
    toReturn[counter] = last; 
    counter++; 

    if (counter == 5) {
      counter = 0 
    }
  }
  return toReturn;
}


public int[] last5unique() {

  int[] toReturn = new int[5];
  Vector<Integer> tmp = new Vector<Integer>();

  int last = read(); 
  tmp.add(last); 

  while (last != -1) {
    last = read(); 
    if (!tmp.contains(last)) {
      tmp.add(last); 
    }
    else {
      for (int i=0; i<tmp.size(); i++) {
        if (tmp.get(i) == last) {
          tmp.remove(i); 
          break;
        }
      }
      tmp.add(last); 
    }
    if (tmp.size() == 5 && last != -1) {
      tmp.remove(0); 
    }
  }

  for (int i=0; i<tmp.size(); i++)
    toReturn[i] = tmp.get(i);

  return toReturn;
}

1 Ответ

0 голосов
/ 01 апреля 2019

Ваша функция last5 () неверна, потому что если у вас есть 6 чисел (или любое количество, не кратное 5) после того, как вы прочитали 5 чисел, вы начнете писать снова с позиции [0], причина

if (counter == 5) {
  counter = 0 
}

и я думаю, что это не то, что им требуется для функции.Если ваш поток 0, 1, 2, 3, 4, 5, 6, 7, -1 , ваша функция вернет 5, 6, 7, 3, 4 , но в моеммнение должно возвращаться 3, 4, 5, 6, 7

Мое решение для last5 () будет выглядеть примерно так:

public int[] last5() {
        LinkedList<Integer> list = new LinkedList<>();
        int[] toReturn = new int[5];
        int quantity = 0;
        int last;

        last = read();
        while (last != -1) {
            list.add(last);

            if (quantity >= 5)
                list.pop();
            else
                quantity++;
            last = read();
        }

        for (int i = 0; i < quantity; i++) {
            toReturn[i] = list.get(i);
        }
        return toReturn;
    }
}

Я использовал LinkedList длясохранить структуру данных очереди только с 5 элементами (или меньше).Вы также можете избежать LinkedList, но вам нужен дополнительный цикл while / for для перемещения на предыдущую позицию всех элементов после того, как вы прочитали 5 элементов.Таким образом, вы можете сохранить исходное положение элементов из потока.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...