Member 12781602 Ответов: 1

Как найти расстояние между двумя буквами. программа Java


У меня есть вопрос, в котором мне нужно найти расстояние между буквами.
например: если входные буквы-A и E
При попытке добраться до E из A нам нужно пересечь B C D. Следовательно, количество букв между E и A равно 3. Расстояние - это количество букв между E и A + 1, которое равно 4.
Я написал код следующим образом:
Я получил ответ на некоторые входные данные. Но я получил неправильный ответ для W A

Что я уже пробовал:

import java.lang.Character;
import java.util.Scanner;
public class Main
{
public static void main(String[] args)throws Exception
{
Scanner in=new Scanner(System.in);
char a=in.next().charAt(0);
char d=in.next().charAt(0);
System.out.println(Math.abs(Character.toLowerCase(a)-Character.toLowerCase(d)));
}
}

[no name]

У вас есть к нам вопрос, в котором мы могли бы вам помочь с домашним заданием?

Member 12781602

Для входа W A мне нужно получить 4 в качестве выхода, а не 22. Как я должен редактировать, чтобы сделать это так?

[no name]

Используйте свой отладчик, чтобы выяснить, почему вы получаете 4, а CPallini получает 22.

[no name]

Подождите минутку, я только что перечитал ваше заявление. Почему вы думаете, что расстояние между W и A составляет только 4, а не 22? Либо вы чего-то не договариваете, либо неправильно поняли домашнее задание.

Richard MacCutchan

Насколько я понимаю, алфавит W имеет более высокое значение, чем A, поэтому ваш алгоритм выдаст отрицательное число. Продолжайте оттуда.

Member 12781602

Вот почему я использовал abs ().

Richard MacCutchan

И вот почему ответ-22.

CPallini

Я пробовал вашу программу
вход: W, A
выход: 22
Это выглядит правильным для меня.

Member 12781602

За этот вход я должен получить 4.

CPallini

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

1 Ответов

Рейтинг:
0

CPallini

Если вам нужно рассмотреть wrap around, то код становится немного сложнее.
Однако я надеюсь, что вы сможете упростить его.

import java.util.Scanner;
public class Main
{
  public static void main(String[] args) throws Exception
  {
    Scanner in = new Scanner(System.in);
    char a = in.next().charAt(0);
    char b = in.next().charAt(0);
    a = Character.toLowerCase(a);
    b = Character.toLowerCase(b);
    int d1, d2;

    if ( a <= b )
    {
      d1 = b - a; // direct distance
      d2 = 26 - b + a; // distance considering wrap around
    }
    else
    {
      d1 = a - b; // direct distance
      d2 = 26 - a + b; // distance considering wrap around
    }
    int  d; // now the distance is the smallest between 'direct' and 'wrapped around'
    if ( d1 <= d2)
      d = d1;
    else
      d = d2;

    System.out.println(d);
  }
}


Richard Deeming

Что выглядит более-сложно для меня. Предполагая, что входные данные являются действительными буквами, почему бы просто не сделать это:

int d = Math.abs(a - b);
if (d > 13) { d = 26 - d; }

CPallini

Ницца.

Richard MacCutchan

"A" - " W " выходит как 4 вместо 22.
Так и должно быть
if (a > b) { d = 26 - d; }

Richard Deeming

Если Вы читаете комментарии к этому вопросу, то это то, что хотел ОП. :)

Richard MacCutchan

Нет он хочет ж На быть 4, а не на W.

CPallini

Расстояние, как правило, определяется как коммутативное.

Richard MacCutchan

Логика (и даже математика) - это одно, вопрос в QA-это совсем другое. :)

CPallini

:-)