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

حل سریع Two Sum با دیکشنری پایتون و شاخص‌های دقیق

دیکشنری پایتون برای حل مسئله؛ فراوانی و مجموع دو عدد · 0٪

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

مثلاً در [4, 8, 3, 9] با هدف دوازده، هنگام رسیدن به هشت مکمل چهار قبلاً دیده شده و پاسخ [0,1] است. اگر چند جواب ممکن باشد، قرارداد را دقیق‌تر می‌کنیم: اولین شاخص دوم در پیمایش و سپس اولین شاخص قبلیِ مکمل را برگردون. برای این کار جای ثبت‌شده یک مقدار تکراری را بازنویسی نکن.

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

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

فعالیت شما

تابع two_sum(nums,target) فهرست اعداد صحیح و هدف صحیح می‌گیرد و [i,j] با i<j و nums[i]+nums[j]==target می‌دهد، یا اگر زوجی نیست [] می‌دهد. از چپ به راست اولین j ممکن، و برای آن کوچک‌ترین i را انتخاب کن. خالی/تک‌عضوی بی‌زوج‌اند؛ مقدار مساوی در دو خانه مجاز است. two_sum([2,2,7],9)=[0,2]. ورودی را تغییر نده؛ از دیکشنری اعضای قبلی استفاده کن. تابع آماده course_check فقط برای ارزیابی است: تابع اصلی را صدا می‌زند و حفظ ورودی را بررسی می‌کند. آن را تغییر نده؛ پاسخ تو همان تابع خواسته‌شده است.

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

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

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

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

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

def two_sum(nums, target):
    # TODO: keep the earliest index for each previously seen value
    pass

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