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

مجموع دو عدد مرتب با دو اشاره‌گر در پایتون

الگوی دو اشاره‌گر در پایتون؛ دو سر فهرست و حذف تکرار · 0٪

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

مثلاً برای [1, 3, 6, 10] و هدف نه، جمع دو سر یازده است؛ راست عقب می‌رود و جمع یک با شش هفت می‌شود. حالا چپ جلو می‌آید و سه با شش جواب می‌دهد. هر حرکت حداقل یک خانه را برای این جست‌وجو کنار می‌گذارد، پس مجموع حرکت‌ها خطی است.

دو بخش ناقص کد را کامل کن. هدف این فعالیت فقط پاسخ True یا False است، نه شماره خانه‌ها. خالی و تک‌عضوی هیچ زوجی ندارند، حتی اگر دو برابر عضو تنها برابر هدف باشد. خطای رایج، برعکس حرکت دادن اشاره‌گرها یا اجازه دادن به left == right است. مقدارهای برابر در دو خانه مجازند؛ شرط متفاوت بودن درباره شاخص‌هاست، همان چیزی که در تمرین قبلی دیدیم.

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

فعالیت شما

تابع sorted_has_pair(nums,target) فهرست صعودی غیرکاهشی اعداد صحیح می‌گیرد و وجود دو خانه متفاوت با جمع هدف را بولی برمی‌گرداند. خالی و تک‌عضوی False، دو مقدار برابر در دو خانه مجاز. sorted_has_pair([1,3,6,10],9)=True. ورودی تغییر نکند؛ با دو اشاره‌گر از دو سر حرکت کن. تابع آماده course_check فقط برای ارزیابی است: تابع اصلی را صدا می‌زند و حفظ ورودی را بررسی می‌کند. آن را تغییر نده؛ پاسخ تو همان تابع خواسته‌شده است.

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

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

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

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

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

def sorted_has_pair(nums, target):
    left, right = 0, len(nums) - 1
    while left < right:
        total = nums[left] + nums[right]
        if total == target:
            return True
        if total < target:
            # TODO: move the correct boundary
            return False
        else:
            # TODO: move the other boundary
            return False
    return False

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