Алгоритм набора слов на аналоговой клавиатуре телефона

289
08 января 2022, 20:50

На собеседовании задали задачу: имеется клавиатура аналогового телефона от 0 до 9, где каждой цифре соответствуют три буквы, 1 - абв, 2 - где и т.д. Необходимо написать реализацию набора слов по следующему принципу: при вводе цифр выводятся в качестве подсказки три слова, начинаются на соответствующие буквы. При вводе 1 - три слова а-, б-, в-, при вводе 1,2 - три слова аг-, бд-, ве-, и т.д. Решить не смог, но до сих пор думаю на реализацией. Подскажите как это можно реализовать, например на java и какую структуру данных использовать. Напрашивается дерево, но не знаю как реализовать.

Answer 1

Допустим в базе хранятся имена абонентов, типа:

  1. Иванов
  2. Петров
  3. Сидоров

Каждой букве в имени сопоставляем число, в соответствии с наборной клавиатурой (диском), в итоге получим:

  1. 422652 (Иванов)
  2. 536652 (Петров)
  3. 6435652 (Сидоров)

Остальное уже дело техники. При наборе цифры 4 - смотрим на массив цифр и понимаем, что с 4-ки начинается только Иванов.

Answer 2

Для начала на 10 кнопках расположить 33 буквы на каждой по 3 не получится, поэтому либо нужно 11 кнопок, либо на каких-то кнопках будет по 4 буквы. Поскольку 3 слова то легче первый вариант.

Например так

     char[][] buttons = {
        {'ъ','ы','ь'},
        {'а','б','в'},
        {'г','д','е'},
        {'ё','ж','з'},
        {'и','й','к'},
        {'л','м','н'},
        {'о','п','р'},
        {'с','т','у'},
        {'ф','х','ц'},
        {'ч','ш','щ'},
        {'э','ю','я'}
    };

А дальше все просто, индекс слова это индекс символа во вложенном массиве, а индекс главного массива индекс кнопки. Последовательность набранных кнопок формирует три начала слова, а после этого например в базе ищутся по одному слову начинающиеся на каждое сочетание. Например последовательное нажатие клавиш: 5 1 выведет три сочетания начала слов: ла, мб, нв. Дальше формируется например запрос в БД (все зависит от того, где хранятся слова).

Answer 3

import java.io.*; 
 
public class Main { 
 
    public static void main(String[] args) throws IOException { 
 
        // Индекс элемента массива words соответствует кнопке номеронабирателя телефона 
        String[] words = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"}; 
        String[] lines = {"", "", "", ""}; 
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); 
        String r = "", t = ""; 
        int n, m; 
        for (int k = 0; k < 7; k++) {   // предполагается 7-значный телефонный номер 
            do { 
                System.out.println("Введите число (0..9):"); 
                r = reader.readLine(); 
            } while (r.length() == 0 || r.length() > 1 || (r.length() == 1 && (r.charAt(0) > '9' || r.charAt(0) < '0'))); 
            n = Integer.parseInt(r); 
            if (k == 6) 
                r = ""; 
            else 
                r = "-"; 
            String s = words[n]; 
            if (n > 1) { 
                for (int i = 0; i < s.length(); i++) { 
                    lines[i] = lines[i].concat(String.format("%c", s.charAt(i))); 
                    System.out.println(lines[i] + r); 
                } 
                if (lines[3].length() > 0 && s.length() == 3) 
                    System.out.println(lines[3] + r); 
            } 
            else { 
                for (int i = 0; i < 3; i++) { 
                    lines[i] = lines[i].concat(String.format("%d", n)); 
                    System.out.println(lines[i] + r); 
                } 
                if (lines[3].length() > 0) { 
                    lines[3] = lines[3].concat(String.format("%d", n)); 
                    System.out.println(lines[3] + r); 
                } 
            } 
        } 
    } 
}

В программе используется американский стандарт расположения букв латиницы на кнопках номеронабирателя телефонного аппарата. В СССР до 1968 года существовала практика наряду с цифрами использовать символы кириллицы на кнопочном номеронабирателе, но стандарта по их размещению не было принято. Кнопки "0" и "1" как в американском, так и в отечественном вариантах размещения оставались свободными от букв. Пример: 0-"", 1-"", 2-"абвг", 3-"дежз", 4-"ийкл", 5-"мноп", 6-"рсту", 7-"фхцч", 8-"шщъы", 9-"ьэюя".

READ ALSO
hibernate + маппинг без сущностей?

hibernate + маппинг без сущностей?

Я разбираю старый проект и нашел интересную вещь, которую не понимаю

134
Как получить сообщения из чата в Slack

Как получить сообщения из чата в Slack

Необходимо получить сообщения из определенного чата Делаю запрос:

113
В чем разница между Comparable и Comparator?

В чем разница между Comparable и Comparator?

Получается, это дублирующие друг друга вещиМожет, есть какие-то реальные различия?

163
Повторить строку несколько раз

Повторить строку несколько раз

В общем есть один метод, который принимает два параметра, например метод

141