حالت آفلاین — محتوا از حافظهٔ کش نمایش داده می‌شود
آموزش الگوریتم و حل مسئله با پایتون؛ تمرین عملی

پاسخ به چند پرس‌وجوی جمع بازه با پایتون

جمع پیشوندی در پایتون؛ پرس‌وجوی بازه بدون دوباره‌کاری · 0٪

✍️ مزیت اصلی جمع پیشوندی وقتی دیده می‌شود که روی یک داده ثابت، پرسش‌های زیادی داریم. اگر برای هر پرسش دوباره اعضای بازه را جمع بزنیم، بخش‌های مشترک را بارها می‌خوانیم. با جدول پیشوندی، یک بار ورودی را می‌بینیم و هر پرسش بعدی فقط یک تفریق دارد. هزینه کلی از جنس طول ورودی به‌اضافه تعداد پرسش‌هاست.

مثلاً برای [2, 6, -1, 3] و پرسش‌های [[0,1],[1,3],[2,2]] جواب‌ها [8,8,-1] هستند. ترتیب پاسخ باید ترتیب خود پرسش‌ها باشد؛ حتی اگر یک بازه دوبار تکرار شود، دو پاسخ لازم داریم. هر پرسش دو شاخص بسته دارد، نه یک شاخص و یک طول.

تابع را مستقل بنویس؛ به توابع درس‌های قبلی دسترسی خودکار ندارد. جدول را یک بار داخل همان تابع بساز و سپس همه پرسش‌ها را پاسخ بده. ورودی خالی فقط با پرسش‌های خالی داده می‌شود و خروجی هم خالی است. خطای رایج، ساختن دوباره جدول درون حلقه پرسش‌ها یا مرتب کردن پرسش‌ها برای راحتی است؛ اولی کار اضافی دارد و دومی ترتیب قراردادی نتیجه را خراب می‌کند.

تابع آماده course_check فقط برای ارزیابی است: تابع اصلی را صدا می‌زند و حفظ ورودی را بررسی می‌کند. آن را تغییر نده؛ پاسخ تو همان تابع خواسته‌شده است.

فعالیت شما

تابع range_sums(nums,queries) فهرست اعداد صحیح و فهرست زوج‌های [left,right] می‌گیرد. هر بازه معتبر و بسته است: 0<=left<=right<len(nums). پاسخ عددی هر بازه را به ترتیب queries در فهرست برگردان؛ پرسش تکراری جواب تکراری دارد. queries خالی خروجی []؛ اگر nums خالی است queries هم خالی خواهد بود. بازه تک‌عضوی و left=0 مجازند. range_sums([2,6,-1,3],[[0,1],[2,2]])=[8,-1]. هیچ ورودی را تغییر نده؛ جدول را یک بار بساز. تابع آماده course_check فقط برای ارزیابی است: تابع اصلی را صدا می‌زند و حفظ ورودی را بررسی می‌کند. آن را تغییر نده؛ پاسخ تو همان تابع خواسته‌شده است.

مطالعهٔ این گام برای همه آزاد است

برای پاسخ‌دادن، بررسی پاسخ، ثبت پیشرفت و استفاده از دستیار باید شرایط شرکت در فعالیت‌ها را داشته باشید.

برای انجام فعالیت وارد شوید

برای انجام فعالیت‌ها ابتدا این دوره‌های پیش‌نیاز را تکمیل کنید:

کد اولیهٔ فعالیت

def range_sums(nums, queries):
    # TODO: build one prefix table and answer every closed interval
    pass

# این تابع آماده فقط برای ارزیابی است؛ آن را تغییر نده.
def course_check(*args):
    from copy import deepcopy
    before = deepcopy(args)
    result = range_sums(*args)
    if args != before:
        raise ValueError('ورودی نباید تغییر کند.')
    return result