LINUX.ORG.RU

Что думаете об этой ф-и (Python)

 ,


1

3

Function Description

It should return the smallest lexicographically higher
string possible from the given string or no answer.

biggerIsGreater has the following parameter(s):w (a string)

Вроде бы работает корректно.

def biggerIsGreater(w):

    def basic(w):
        combi=list(permutations(sorted(w)))
        index=combi.index(tuple(w))
        return "".join(combi[index+1]) if combi[-1] != tuple(w) else 'no answer'


    def res_calc(w):
        new_w=w[l-9:l]
        result=basic(new_w)
        if result=='no answer':
            result=new_w
        r=w[:l - 9] + result
        if r>w:
            return r
        else:
            return biggerIsGreater(w[:l - 9])

    l = len(w)

    if l < 10:
        return basic(w)
    else:
        return res_calc(w)

На hackerrank не награждают баллами, т.к. она слишком долгая по времени.



Последнее исправление: hibiscusM (всего исправлений: 2)
Ответ на: комментарий от Jopich1

вроде нет, она локальная, но ф-я дает правильный результат каждый раз.

hibiscusM
() автор топика

каждый каст типа и копирование у тебя отъедает память, рекурсия отъедает у тебя память гигабайтами (пока не упадёт по той или иной причине) и вообще, что-то мне не нравится в твоих слайсах

anonymous
()
Ответ на: комментарий от anonymous

а без type casting надо подумать как это. Самостоятельно доработаю позже.

hibiscusM
() автор топика
Ответ на: комментарий от Jopich1

главное недовольство то в чем, можно пояснения?

hibiscusM
() автор топика
Ответ на: комментарий от anonymous

тестировались варианты типа: zzzzzzzyyxxwwwvvuuuuuuttttsssssrrrrqqqqpooonnnmmmmmmmmllllkkjjiihhhgggfffffeeeeedddddccccbbbbaa

onapfkqihlffxgbazbbyojidwuauptlshcxircaigbcaiyeucyvfhvzrjgbwhlbnbammfv

и не падает. Первый no answer Второй дает полноценный ответ мгновенно.

hibiscusM
() автор топика
Ответ на: комментарий от hibiscusM

попробуй войну и мир скормить, например

anonymous
()

ф-и

А расскажите, на что вы тратите все это сэкономленное время?

t184256 ★★★★★
()

То есть нужно переставить буквы в строке w так, чтобы w' > w, но для любой перестановки w'' (w'' != w', w'' != w) верно w' < w''?

Это точно можно сделать со значительно меньшей сложностью по времени и тем более по памяти. Вот это же ужас страшный: combi=list(permutations(sorted(w)))

proud_anon ★★★★★
()
Ответ на: комментарий от proud_anon

Given a word (w), create a new word by swapping some or all of its characters. This new word must meet two criteria:

  • It must be greater than the original word
  • It must be the smallest word that meets the first condition
hibiscusM
() автор топика

l
new_w
r
basic()
res_calc()

Я думаю, что тот кто тебя учил именовать - садист, либо бывший математик который думает, что программист.

Dred ★★★★★
()
Ответ на: комментарий от proud_anon

способ со сложностью не более O(Nlog(N)), требующий O(N) памяти.

А permutations за N*N*log(N) это делает? Слишком жирно. Можно память O(1), а время O(N). Это надо расписать перестановки и помедитировать над ними, чтобы понять как.

xaizek ★★★★★
()
Ответ на: комментарий от xaizek

permutations даёт все перестановки, а их N!. А нужна только одна перестановка.

Всё пытаюсь понять, нужна ли ещё сортировка (тогда будет в самом худшем случае N³ * log(N)) или можно как-то обойтись.

proud_anon ★★★★★
()
Последнее исправление: proud_anon (всего исправлений: 2)
Ответ на: комментарий от proud_anon

Да, но считать квадратичным алгоритмом N! раз было бы больно, да и нет необходимости. Надо просто понять как из одной перестановки сделать следующую/предыдущую в лексикографическом порядке. permutations же их так и генерирует, я практически уверен (хотя может и нет, если элементы сравнивать нельзя).

Сортировка не нужна, если правильно генерировать.

xaizek ★★★★★
()
Последнее исправление: xaizek (всего исправлений: 2)

else 'no answer'

Не нужно делать все настолько stringly typed. Есть же None.

provaton ★★★★★
()
3 ноября 2018 г.
Ответ на: комментарий от proud_anon

Все руки не доходили решить задачу.

Вот наконец-то время появилось. На сайте принято.


def biggerIsGreater(w):
    import re
    ww=w+'%'
    last_ind=re.search('%',ww).end()-2
    gen=((-i-1,-j) for i in range(-last_ind, 0) if -i-1 >= 0 and w[-i] > w[-i-1]
                         for j in range(-last_ind, -i - 1) if w[-j] > w[-i - 1])

    try:
        ind1,ind2=next(gen)
        w2 = w[:ind1] + w[ind2] + w[ind1 + 1:ind2] + w[ind1]
        if ind2 != last_ind or ind2 != ind1+1:
            w=w2+w[ind2+1:]
            w1=w[ind1+1:]
            w1=w1[::-1]
            return w[:ind1+1]+w1
        else:
            return w2
    except:
        return 'no answer'
hibiscusM
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.