Для строки, которая может иметь несколько вхождений одного и того же символа, вернуть ближайший такой же символ из любого указанного символа в строке.
Учитывая строку s и количество запросов n. В каждом запросе вам дается индекс a (где 0 <= a <= |s|) символа, и вам нужно напечатать индекс того же символа в туалете. Если ответов несколько, выведите наименьший из них. В противном случае выведите -1.
Например, строка s = 'youyouy' с заданным запросом 3: есть два совпадающих символа с индексами 0 и 6, каждый из которых находится на расстоянии 3, мы выбираем наименьший из них, равный 0.
Вот мой план: Я помещаю строку в словарь, ключ - это отдельные буквы в строке, значения - это буквы, соответствующие индексам. Получив запрос, найдите соответствующую букву в словаре и верните наиболее близкое значение к запросу.
def closest(s, queries):
res = []
dict2 = {}
#dict2 - letter - indexs
for i in range(len(s)):
if s[i] not in dict2:
dict2[s[i]]=[i]
else:
dict2[s[i]].append(i)
for num in queries:
#closet- denotes closet letter index
closet = math.inf
#num is out of range , append -1
if num > (len(s)-1):
res.append(-1)
continue
#this is the only one letter, append -1
letter=s[num]
if len(dict2[letter])==1:
res.append(-1)
continue
#temp = list for that letters
temp=dict2[s[num]]
index=temp.index(num) . #in the list, letter index's index in list
if index==0:
closet=temp[1]
elif index==(len(temp)-1):
closet=temp[index-1]
else:
distance1=num-temp[index-1] . #left
distance2=temp[index+1]-num . #right
if distance1 <= distance2:
closet=temp[index-1]
else:
closet=temp[index+1]
if closet == math.inf:
res.append(-1)
else:
res.append(closet)
return res
У меня две ошибки во время выполнения. Мне интересно, не могли бы вы мне помочь, возможно, сократить время выполнения?
Кроме того, я ищу другие предложения! Некоторое время я использовал Python и ищу работу (новый выпускник университета). Java обычно работает быстрее Python? Стоит ли переходить на Java?
@ HåkenLid. они просто сказали мне, что они прерваны из-за ошибки времени выполнения, без чего-либо еще
Вы можете значительно улучшить код, используя правильные имена переменных. temp или dict2 затрудняют чтение, и, как говорит Дзен Python, читаемость имеет значение. Также изучите приоритет операторов, в частности, == и > по сравнению с - (частый вопрос на собеседовании, поскольку он показывает более глубокое понимание) и избавьтесь от ненужных скобок в нескольких if.
Я изменил temp на t и dict2 на d и избавился от некоторых скобок в if s. Но все равно не работает. @digitalarbeiter
@Robin Я не имел в виду, что вы еще больше сокращали имена переменных; скорее дайте им имена, которые на самом деле иметь в виду что-то. Не могли бы вы опубликовать s и queries, с которыми вы тестируете функцию?
Кто эти «они», которые выдали вам ошибку времени выполнения (или две, как бы это ни казалось маловероятным)? Если вы запустите это в терминале (/ console), какую ошибку вы получите? Редактировать укажите полный текст в вопросе, пожалуйста.
@digitalarbeiter он будет более читаемым, если я изменю его что-то значение, но это не решает мою проблему. Я провожу тест кода. Я не могу получить тестовый код.
@Robin Читаемые имена не сразу решают ошибку, которую вы ищете, но они буду помогают вам и другие понимать ваши мысли и код и, таким образом, облегчают другим помощь вам. Сделайте понятные идентификаторы привычка, которые вы никогда не сломаете, даже для самых непростых задач.
Вы пробовали писать модульные тесты для этой функции? Получите 100% покрытие py.test и постарайтесь придумать как можно больше и необычных вводов для ваших тестов: пустая строка, строки с умляутами (адское кодирование; вот ö только для вас), пустой список для запросов, отрицательное число для запроса и тому подобное. Неистовствовать! Я не знаю, что мы можем смело предположить для s и queries, поэтому отладить это сложно ..
Нет. Но я думаю, это из-за скорости. Python работает медленнее, чем Java. Я подумываю преобразовать свой код в java. Не могли бы вы помочь? @digitalarbeiter
Мне любопытно: что приводит вас к выводу, что это может быть связано со скоростью? «Ошибка выполнения» указывает на то, что нет указывает время выполнения, это указывает на ошибку для входного значения, которое вы не придумали.
Python я делаю из любви. Чтобы сделать Java, вам нужно платить меня. J2EE, мы говорим о боевой оплате. :-П
Ну, ты даже не показал мне, что у тебя есть такая способность платить тебе за мою работу. @digitalarbeiter






Я пытаюсь сделать как можно проще, но выгляжу немного сложновато. Хотя ваш вопрос заключается в том, чтобы избежать ошибки во время выполнения, я хочу представить свою идею
s='oooyyouoy'
k='0123456789'
def cloest(string,pos):
c = string[pos]
p1 , p2 = s[:pos] , s[pos+1:]
# reserve left part and find the closet one , add 1 because len(p1)=final_position + 1
l = len(p1) - (p1[::-1].find(c) + 1)
# find without reserve and add 1 because s[pos+1:]
r = (p2.find(c) + 1) + pos
# judge which one is closer if same chose left one
result = l if (pos - l) <= (r - pos) else r
if result == pos:
return -1
else:
return result
print(cloest(s,4))
Какие у вас ошибки во время выполнения?