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

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

پنجره لغزان در پایتون؛ جمع بازه ثابت و مقدارهای منفی · 0٪

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

برای نمونه، [3, 1, -2, 6] با طول دو جمع‌های [4,-1,4] دارد. از جمع چهار، سه را کم و منفی دو را اضافه می‌کنیم تا منفی یک شود. سپس یک خارج و شش وارد می‌شود تا به چهار برسیم. فقط جمع اولین پنجره به محاسبه کامل نیاز دارد.

تابع ناقص هم اعتبار طول را بررسی می‌کند و هم جمع اول را ساخته است؛ به‌روزرسانی داخل حلقه و ثبت نتیجه را تکمیل کن. وقتی k برابر طول فهرست باشد، فقط یک جمع داریم. خطای رایج، کم کردن nums[i-k+1] یا اضافه کردن عدد تازه بدون حذف عدد قدیمی است؛ هر دو بعد از اولین پنجره جواب را خراب می‌کنند. ترتیب خروجی باید دقیقاً ترتیب حرکت از چپ به راست باشد، حتی اگر چند جمع برابر شوند.

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

فعالیت شما

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

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

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

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

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

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

def window_sums(nums, k):
    if k <= 0 or k > len(nums):
        return []
    current = sum(nums[:k])
    result = [current]
    for i in range(k, len(nums)):
        # TODO: remove the outgoing value and add the incoming one
        pass
    return result

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