Нужна помощь в выяснении, почему мое сравнение строк не проходит все тестовые случаи - PullRequest
1 голос
/ 14 мая 2019

Напишите функцию с именем singleline_diff, которая принимает две однострочные строки.Вы можете предположить, что обе строки всегда являются одной строкой и не содержат символов новой строки.Функция должна возвращать индекс первого символа, который отличается между двумя строками.Если строки совпадают, функция должна возвращать константу IDENTICAL, которая уже определена как -1.

Если строки имеют разную длину, но вся более короткая строка соответствует началу более длинной строки,затем первое различие находится в индексе, который находится на единицу после последнего символа в более короткой строке.Другими словами, ни один символ после конца более короткой строки не определен так, чтобы отличаться от любого символа, существующего в более длинной строке в этом месте.

Подсказки: 1) Вам не нужно проверять, действительно лидва входа - это одна строка или нет.Вы можете предположить, что это так.

2) Сначала вы должны проверить длину двух входов и определить длину более короткой линии.

3) Ищите различия в линиях допоследний символ в более короткой строке.

4) Если вы не найдете каких-либо различий, подумайте о том, что вы должны делать в двух возможных случаях: (1) строки имеют одинаковую длину и (2)строки имеют разную длину.

Я написал функцию, как указано в инструкциях, и использовал ряд условных выражений для сравнения длин строк.Как только длины строк определены, я инициализирую индексную переменную от i до 0, которую я использую с циклом for для прохождения символов строк в поисках первого различия.Я использую условные (if, elif и др.) Вместе с возвратами для возврата индекса, в котором произошла разница, или возврата IDENTICAL (что равно -1).

IDENTICAL = -1

def singleline_diff(line1, line2):
    """
    Inputs:
      line1 - first single line string
      line2 - second single line string
    Output:
      Returns the index where the first difference between
      line1 and line2 occurs.

      Returns IDENTICAL if the two lines are the same.
    """
    if len(line1) > len(line2):
      i = 0 
      for i in range(len(line2)):
        if line1[i] == line2[i]:
          i += 1
        elif line1[i] != line2[i]:
          return i
        else:
          return i+1
    elif len(line1) < len(line2):
      i = 0
      for i in range(len(line1)):
        if line1[i] == line2[i]:
          i += 1
        elif line1[i] != line2[i]:
          return i
        else:
          return i+1
    else: #Condition where the lengths of the strings are equal
      i = 0
      for i in range(len(line1)):
        if line1[i] == line2[i]:
          i += 1
        elif line1[i] != line2[i]:
          return i
        else:
          return IDENTICAL

Я создал шесть тестовых случаев (см. Ниже),То, как мой код написан прямо сейчас, дает мне половину моих тестов.Я зашла в тупик, пытаясь отладить, когда мой код не может вернуть ожидаемые значения.

print(singleline_diff("abcd", "abcd")) #Should return -1, instead get None
print(singleline_diff("abcd", "abdf")) #Should return 2 (Works)
print(singleline_diff("1234566", "1234567")) #Should return 6 (works)
print(singleline_diff("123", "1234")) #Should return 3, instead get None
print(singleline_diff("4321", "321")) #Should return 0 (works)
print(singleline_diff("lollejrlke", "lollejrlkefa")) #Should return 10, instead get None

1 Ответ

2 голосов
/ 14 мая 2019

Ваш цикл for завершается, когда он никогда не находит неравный символ (что имеет место, когда одна из строк является начальной подстрокой другой), поэтому он не попадает в оператор return,поэтому он вернет None.

Ваши предложения else: return IDENTICAL не будут выполнены, поскольку if line1[i] == line2[i]: и elif line1[i] != line2[i]: охватывают все возможные варианты для этого индекса.

Кроме того, вручную увеличивается i является избыточным, потому что вы перебираете диапазон, который уже предписывает, какое число будет указываться на каждой итерации.

Рассмотрим что-то вроде этого:

def singleline_diff(line1, line2):
    """
    Inputs:
      line1 - first single line string
      line2 - second single line string
    Output:
      Returns the index where the first difference between
      line1 and line2 occurs.

      Returns IDENTICAL if the two lines are the same.
    """
    if len(line1) > len(line2):
        for i in range(len(line2)):
            if line1[i] != line2[i]:
                return i
        # We've checked all the characters in the range and found no differences
        # but we know line1 is longer, so this is the position at which they differ
        return len(line2)
    elif len(line1) < len(line2):
        for i in range(len(line1)):
            if line1[i] != line2[i]:
                return i
        return len(line1)
    else:
        for i in range(len(line1)):
            if line1[i] != line2[i]:
                return i
        # They're the same length, and we've found no differences,
        # therefore the strings are identical
        return IDENTICAL

Вы можете еще больше упростить этои только один раз напишите цикл for.

def singleline_diff(line1, line2):
    end = min(len(line1), len(line2))
    for i in range(end):
        if line1[i] != line2[i]:
            return i
    if len(line1) != len(line2):
        return end
    return IDENTICAL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...