Пройдя тест по программированию и не получил шаблон алгоритмический - PullRequest
1 голос
/ 01 марта 2020

Вопрос в том, что существует самолет с посадочным местом AK, исключая ряд I. Метод дает вам места, которые заняли в строке «1 C 2B 1J» в качестве примера. Найдите, сколько семей из 4 человек, если они сгруппированы или разделены равномерно по проходу.

Так что в

 A B C D E F G H J K    A B C D E F G H J K
  XOO    OOXX   XXX     OOX   OOOO   OXO
  XXX    OOOO   XXX     OOX   OOOO   OOO

возвращаемое значение должно быть

                        OOX FFFF OXO
                        OXO FFFF OOO

быть двумя, потому что 2 семьи из четырех могут соответствовать. Если вводом является (1, ""), верните 2 по тем же причинам, что и приведенные схемы размещения. Я получаю на один больше, чем я должен в этом алгоритме.

import java.lang.*;
import java.util.regex.Pattern;
import java.util.regex.Matcher;
import java.util.*;
//Available 4seatsections from B-E[1-4] F-J[5-9] with aisles else D-G[3-7]

class AirplaneFamilesNSeatFinder {
static int solution(int N, String S) {
    String[] seats = S.split(" ");
    int numberOfFamilySeats = 0;
    int[][] planeSeats = new int[N][10];
    Map<Integer, Integer> seatsMap = new HashMap<Integer, Integer>();

    int[][] takenSeats = new int[N][10];
    seatsMap = validSeats(S, N);
    List<Map.Entry<Integer, Integer>> list = new LinkedList<Map.Entry<Integer, Integer>> 
    (seatsMap.entrySet());
    Collections.sort(list, new Comparator<Map.Entry<Integer, Integer>>(){
        public int compare(Map.Entry<Integer, Integer> o1, Map.Entry<Integer, Integer> o2)
        {
            return (o1.getValue()).compareTo(o2.getValue());
        }
    });
    for(int i = 0;i<N;i++) {
        for(int k=0;k<10;k++) {
            for(Map.Entry<Integer, Integer> seatAssigned : list) {
                int seat = seatAssigned.getKey();
                int row = seatAssigned.getValue();
                if(seat==i && row==k)
                    takenSeats[i][k] = 1;                   
            }
        }
    }
    int seatsNeeded = seats.length*4;
    if(seatsNeeded<(N*10)) {
        for(int i = 0;i<N;i++) {
            for(int k=0;k<10;k++) {
                if((k+1)<10) {
                    k=k+1;
                    boolean foundSeat = false;
                    System.out.println("Debug: " + foundSeat + " " + numberOfFamilySeats + " " + k);
                    if(k==1 && (k+3)<10 && takenSeats[i][k+1]!=1 && takenSeats[i][k+2]!=1 && 
       takenSeats[i][k+3]!=1&& takenSeats[i][k+4]!=1) {
                        foundSeat = true;
                    }else if(k==3 && (k+3)<10 && takenSeats[i][k+1]!=1 && takenSeats[i][k+2]!=1 && 
     takenSeats[i][k+3]!=1&& takenSeats[i][k+4]!=1) {
                        foundSeat = true;
                        takenSeats[i][3]==1
                    }else if(k==5 && (k+3)<10 && takenSeats[i][3]!=1 && takenSeats[i][k+1]!=1 && 
       takenSeats[i][k+2]!=1 && takenSeats[i][k+3]!=1&& takenSeats[i][k+4]!=1) {
                        foundSeat = true;
                    }
                    if(foundSeat) {
                        numberOfFamilySeats++;
                        i++;
                    }
                    System.out.println("Debug:foundSeat  " + foundSeat + " " + numberOfFamilySeats + 
       " " + k);
                    foundSeat = false;
                }
            }
        }

    } else {
        return 0;
    }


    return numberOfFamilySeats;
}

static Map<Integer, Integer> validSeats(String S, int N) {
    String[] seats = S.split(" ");
    int length = seats.length;
    Pattern p = Pattern.compile("-?\\d+");
    Map<Integer, Integer> tempSeatsMap = new HashMap<Integer, Integer>();
    String[] rowNames = {"A", "B", "C", "D", "E", "F", "G", "H", "J", "K"};
    for(int i = 0;i<length;i++) {
        for(int k = 0;k<rowNames.length;k++) {
            if(seats[i].contains(rowNames[k])) {
                Matcher m = p.matcher(seats[i]);
                Integer seat = 0;
                while (m.find()) {
                  seat =Integer.parseInt(m.group());
                }
                if(seat<=N) {
                    tempSeatsMap.put(seat, k);
                }
            }
        }
    }
    return tempSeatsMap;
}

public static void main(String[] args) {
    String s = "1A 2F 1C";
    System.out.println("Number of familes " + solution(3, s));
}

}

1 Ответ

1 голос
/ 02 марта 2020

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

  1. validSeats возврат для каждого ряда (1,2,...) только последний место (A,B,...) перечислены в переданном списке мест. Поэтому некоторые занятые места не учитываются. Например, для списка мест 1 C 2B 1G 1E 2F 2D validSeats будут найдены только места 1E и 2D . Это вызвано использованием типа Map, который может содержать каждый ключ только один раз. Если пара ключ / значение (K1/V2) установлена ​​с помощью Map#put и пара ключ / значение (K1/V1) с тем же ключом K1 уже существует, старое значение V1 заменяется новым значением V2. Это означает, что ранее найденные места теряются. Чтобы предотвратить это, тип Map должен быть заменен. Одна возможность состоит в том, чтобы заполнить позднее использованный массив int[][] takenSeats напрямую вместо того, чтобы брать объезд через Map -экземпляр.

    Кроме того, нет необходимости разбивать переданный список мест. Вместо этого механизм регулярных выражений может быть применен непосредственно к переданной строке.

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

    private static int[][] validSeats(int numberOfRows, String seatList) {
        int[][] takenSeats = new int[numberOfRows][10]; 
        Pattern p = Pattern.compile("\\d{1,2}-?[A-Z]");
        Matcher m = p.matcher(seatList);
        while (m.find()) {
            String seat = m.group().replace("-", "");                                   // e.g. 12C
            char letter = seat.substring(seat.length() - 1, seat.length()).charAt(0);   //      12
            String row = seat.substring(0, seat.length() - 1);                          //        C
            int letterIndex = letter > 'H' ? letter - 'A' - 1 : letter - 'A';           // Map ABC DEFG HJK -> 012 3456 789 
            int rowIndex = Integer.parseInt(row) - 1;                                   // Map 123...       -> 012...       
            takenSeats[rowIndex][letterIndex] = 1;
        }
        return takenSeats;
    }
    
  2. solution содержит несколько fl aws, например:

    • int[][] takenSeats заполнено неправильно. Для приведенного выше примера только с 1E (как индекс 04 ) и 2D (как индекс 13 ) 2E (в качестве индекса 14 ).
    • В нескольких местах кода используется неверный индекс. Например, для случая k = 1 проверяются места takenSeats[i][k+1], takenSeats[i][k+2], takenSeats[i][k+3] и takenSeats[i][k+4]. Однако, так как индекс начинается с нуля, необходимо проверить местоположения takenSeats[i][k], takenSeats[i][k+1], takenSeats[i][k+2] и takenSeats[i][k+3].
    • Не учитывается, что в та же строка комбинация BCDE исключает комбинацию DEFG . Аналогично, комбинация DEFG исключает комбинацию FGHJ .


    Возможная альтернативная реализация:

    private static int solution(int numberOfRows, String seatList) {
        int numberOfFamilySeats = 0;
        int[][] takenSeats = validSeats(numberOfRows, seatList);                // 0: free, 1: initially occupied, 2: calculated family seats
        for (int rowIndex = 0; rowIndex < numberOfRows; rowIndex++) {           // Check each row
            for (int letterIndex = 1; letterIndex <= 5; letterIndex +=2) {      // Check neighboring seats of B (->CDE), D (->EFG) and F (->GHJ) 
                if (takenSeats[rowIndex][letterIndex] == 0 && takenSeats[rowIndex][letterIndex + 1] == 0 && takenSeats[rowIndex][letterIndex + 2] == 0 && takenSeats[rowIndex][letterIndex + 3] == 0) { 
                    for (int familySeats = 0; familySeats < 4; familySeats++) { // Mark family seats as occupied 
                        takenSeats[rowIndex][letterIndex + familySeats] = 2;
                    }
                    if (letterIndex == 1) letterIndex = 3;                      // BCDE excludes DEFG
                    else if (letterIndex == 3) letterIndex = 5;                 // DEFG excludes FGHJ
                    numberOfFamilySeats++;                                      // Found free family seat
                }
            }
        }
        System.out.println(Arrays.deepToString(takenSeats));                    // Optionally print seat plan
        return numberOfFamilySeats;
    }
    

Пример:

public static void main(String[] args) {
    String seatList = "1F 2D 2G 3C 3D 4B 5H 6A 7B 7F";
    System.out.println("Number of families: " + solution(7, seatList)); 
}

Вывод:

[[0, 2, 2, 2, 2, 1, 0, 0, 0, 0], [0, 0, 0, 1, 0, 0, 1, 0, 0, 0], [0, 0, 1, 1, 0, 2, 2, 2, 2, 0], [0, 1, 0, 2, 2, 2, 2, 0, 0, 0], [0, 2, 2, 2, 2, 0, 0, 1, 0, 0], [1, 2, 2, 2, 2, 2, 2, 2, 2, 0], [0, 1, 0, 0, 0, 1, 0, 0, 0, 0]]
Number of families: 6
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...