Так я пытаюсь решить проблему 3SUM и следующего моего алгоритммодифицированный алгоритм 3SUM не очень хорошо работает с плавающей точкой
def findThree(seq, goal):
for x in range(len(seq)-1):
left = x+1
right = len(seq)-1
while (left < right):
tmp = seq[left] + seq[right] + seq[x]
if tmp > goal:
right -= 1
elif tmp < goal:
left += 1
else:
return [seq[left],seq[right],seq[x]]
Как вы можете видеть, что это действительно универсальный алгоритм, который решает эту проблему в O (n).
Проблема, с которой я столкнулся, заключается в том, что этот алгоритм не похож на работу с числами с плавающей запятой.
Чтобы проверить, что моя теория верна, я дал ему следующие два массива
FloatingArr = [89.95, 120.0, 140.0, 179.95, 199.95, 259.95, 259.95, 259.95, 320.0, 320.0]
IntArr = [89, 120, 140, 179, 199, 259, 259, 259, 320, 320]
findThree(FloatingArr, 779.85) // I want it to return [259.95, 259.95, 259,95]
>> None // Fail
findThree(FloatingArr, 777) // I want it to return [259,259,259]
>> [259, 259, 259] // Success
алгоритм делает работу, но это не кажется, хорошо работать с числами с плавающей точкой. Что я могу сделать, чтобы исправить это?
Для получения дополнительной информации, мой первый массив изначально представляет собой список строк цен, но для того, чтобы сделать математику с ними, мне пришлось снять знак «$». Мой подход при этом заключается в том, что это
for x in range(len(prices)):
prices[x] = float(prices[x][1:]) // return all the prices without the "$" sign. Casting them to float.
Если есть намного лучший способ, пожалуйста, дайте мне знать. Я чувствую, что эта проблема не совсем о findThree(), а скорее как я изменил исходный массив цен.
Редактировать: Увидеть, что это действительно проблема с плавающей точкой, я думаю, мой следующий вопрос будет лучшим способом преобразования строки в int после того, как я отключу «$»?
'0.1 + 0,2! = 0,3'. Прочитайте [вопросы округления с плавающей точкой] (http://floating-point-gui.de/basic/). – user2357112
Как первоначально хранятся цены (какой формат используется)? – kraskevich
@ user2040251 Первоначально это нечто подобное ['$ 120,00', '$ 140,00', '$ 179,95', '$ 199,95', '$ 259,95', '$ 259,95', '$ 259,95', '$ 320,00', '$ 320,00', '$ 89,95'] – user3277633