Python3 ծրագիր՝ պտտման հարցումների և տվյալ տողի K-րդ նիշի համար մշտական ժամանակում


Այս խնդրի դեպքում մենք պետք է կատարենք հարցումները ըստ տրված կանոնների և տպենք նիշերը թարմացված տողից։ Մենք խնդիրը կլուծենք՝ օգտագործելով երկու տարբեր մոտեցումներ. Առաջին մոտեցման դեպքում մենք կօգտագործենք լարերի ռոտացիայի հայեցակարգը, իսկ երկրորդ մոտեցման դեպքում մենք կօգտագործենք ինդեքսների հարմարեցման մոտեցումը:

Խնդրի հայտարարություն – Մեզ տրված խնդիրն է՝ կատարել տրված հարցումներ տողի վրա: Մենք տվել ենք հարցումների զանգված, և յուրաքանչյուր հարցում պարունակում է երկու ամբողջ թիվ։

Հետևեք ստորև բերված հայտարարություններին՝ տողի վրա տրված հարցումները կատարելու համար:

  • (1, l) – Մենք պետք է ձախ պտտենք լարը l անգամ:

  • (2, l) – Մենք պետք է մուտք գործենք նիշը l-րդ դիրքից: Այստեղ, 1 <= l <= n.

Նմուշի օրինակներ

Մուտք

queries = [[1, 3], [2, 3], [2, 4], [2, 2]], s = "vdflkmng"

Ելք

m, n, k

Բացատրություն – Եկեք կատարենք զանգվածում տրված բոլոր չորս հարցումները:

  • Առաջին հարցումում կատարել տողի 3 ձախ պտույտ։ Վերջնական տողը կլինի «lkmngvdf»:

  • Տպեք երրորդ նիշը, որը «m» է:

  • Տպեք չորրորդ նիշը, որը «n» է:

  • Տպեք երկրորդ նիշը, որը «k» է:

Մուտք

queries = [[1, 3], [1, 2], [1, 3], [2, 2]], s = "welcome"

Ելք

l

Բացատրություն

  • Առաջին հարցումից հետո տողը կլինի «comewel»:

  • Երկրորդ հարցումից հետո տողը կլինի «mewelco»:

  • Երրորդ հարցումից հետո տողը կլինի «elcomew»:

  • Վերջին հարցումում այն տպում է 2-րդ նիշը, որը «l» է:

Մոտեցում 1

Այս մոտեցմամբ մենք տրված տողը բաժանում ենք երկու մասի և նորից միանում՝ N ձախ պտույտներ կատարելու համար։ Դրանից հետո մենք մուտք ենք գործում նիշը տվյալ ինդեքսից երկրորդ հարցման մեջ։

Ալգորիթմ

Քայլ 1 – Առաջին քայլում մենք պահանջում ենք կրկնել բոլոր հարցումների զանգվածը:

Քայլ 2 – Եթե que[m][0] == 1, կատարեք s տողի que[m][1] ընդհանուր պտույտները և պահեք այն s-ում:

Քայլ 2.1 – Qu[m][1] ձախ պտույտներ կատարելու համար մենք կարող ենք m ցուցանիշից տողը բաժանել երկու մասի և միացնել աջ և ձախ մասը:

Քայլ 3 – Եթե que[m][0] == 2, մենք պետք է տպենք նիշը if que[m][1] ինդեքսից:

Քայլ 4 – Մուտք գործեք նիշը տվյալ ինդեքսից և ցուցադրեք այն ելքում:

Օրինակ

def executeQueries(s, str_len, que, que_len):
    # Traverse query
    for m in range(que_len):
        # String rotation
        if que[m][0] == 1:
            # Rotate the string by que[m][1] to the left
            s = s[que[m][1]:] + s[:que[m][1]]
        else:
            index = que[m][1] - 1
            # Show character
            print(s[index])
# Driver code
if __name__ == "__main__":
    s = "vdflkmng"
    length = len(s)
    queries = [[1, 3], [2, 3], [2, 4], [2, 2]]
    queries_length = len(queries)
    executeQueries(s, length, queries, queries_length)

Արդյունք

m
n
k

Ժամանակի բարդություն – O(M*N), երբ մենք տողը բաժանում ենք երկու մասի և անցնում ենք ցուցակը:

Տիեզերական բարդություն – O(N), քանի որ մենք պահում ենք պտտվող տողը:

Մոտեցում 2

Այս մոտեցումը վերը նշված մոտեցման օպտիմալացված տարբերակն է: Այստեղ մենք ցույց ենք տալիս վերջին ցուցանիշը: Երբ մենք կատարում ենք հարցումը, մենք թարմացնում ենք ցուցիչի արժեքը, որն օգնում է մեզ խնայել ժամանակ և տարածություն:

Ալգորիթմ

Քայլ 1 – Սահմանեք «ind_ptr» փոփոխականը և սկզբնավորեք զրոյով՝ ներկայացնելով ցուցիչի ցուցիչը:

Քայլ 2 – Օգտագործեք օղակը՝ ցանկը անցնելու համար:

Քայլ 3 – Եթե que[m][0]-ը հավասար է 1-ի, մենք պետք է շահարկենք ցուցիչի արժեքը:

Քայլ 3.1 – Ավելացրե՛ք que[m][1] ind_ptr-ին, վերցրե՛ք մոդուլը ստացված արժեքի 26-ով և կրկին վերագրեք այն ind_ptr փոփոխականին:

Քայլ 4 – Եթե que[m][0]-ը հավասար է 2-ի, մենք պետք է տպենք նիշը, որը գտնվում է que[m][1] ինդեքսում:

Քայլ 5 – Ավելացրեք que[m][1] – 1 ind_ptr փոփոխականին և վերցրեք դրա մոդուլը 26-ով: Դրանից հետո ստացված արժեքը վերագրեք ինդեքսային փոփոխականին:

Քայլ 6 – Մուտք գործեք նիշը ինդեքսից և տպեք այն ելքում ցուցադրելու համար:

Օրինակ

def executeQueries(s, str_len, que, que_len):
    # Starting pointer
    ind_ptr = 0
    # Traverse query
    for m in range(que_len):
        # String rotation
        if que[m][0] == 1:
            # Change index pointer value
            ind_ptr = (ind_ptr + que[m][1]) % str_len
        else:
            index = que[m][1]
            # Get the rotational index of the character
            index = (ind_ptr + index - 1) % str_len
            # Show character
            print(s[index])
if __name__ == "__main__":
    s = "vdflkmng"
    length = len(s)
    queries = [[1, 3], [2, 3], [2, 4], [2, 2]]
    queries_length = len(queries)
    executeQueries(s, length, queries, queries_length)

Արդյունք

m
n
k

Ժամանակի բարդություն – O(M), երբ մենք կրկնում ենք հարցումների տվյալ ցանկը:

Տիեզերական բարդություն – O(1), քանի որ մենք օգտագործում ենք մշտական տարածություն:

Լարի ձախ պտույտները կատարում ենք ըստ տրված պայմանների։ Ծրագրավորողները կարող են նաև փորձել կատարել հարցումներ, որոնք պարունակում են լարերի ճիշտ ռոտացիա: