LeetCode: Add Two Numbers, soluție iterativă în Python 3

  • 1 minute de citit
  • 3 exemple de cod

Disponibil și în English

[Link către problemă]

Salut,

Iată soluția mea la problema „Add Two Numbers” de pe LeetCode.

Exemplu:

<strong>Input:</strong> (2 -> 4 -> 3) + (5 -> 6 -> 4)<strong>Output:</strong> 7 -> 0 -> 8<strong>Explanation:</strong> 342 + 465 = 807.

Când rezolv probleme pe site-uri precum LeetCode, îmi place să scriu codul în propriul meu IDE, de aceea vei vedea câteva funcții ajutătoare pe lângă codul soluției.

class Solution(object):    def _get_append_func(self, root):        _root = root        def __add_to_list(value):            nonlocal _root            _root.next = ListNode(value)            _root = _root.next        return __add_to_list    def _compute(self, result, base=10):        carry = result // base        rest = result % base        return carry, rest    def addTwoNumbers(self, l1, l2):        """        :type l1: ListNode        :type l2: ListNode        :rtype: ListNode        """        root_node = None        root_append_func = None        term_1 = l1        term_2 = l2        saved_carry = 0        while True:            # sfârșitul expresiei; adună transportul (carry), dacă există            if term_1 is None and term_2 is None:                if saved_carry > 0:                    root_append_func(saved_carry)                break            # Nu am ajuns la capăt, presupunem că ce mai rămâne din termen este 0            if term_1 is None:                term_1 = ListNode(0)            if term_2 is None:                term_2 = ListNode(0)            # adună cei doi termeni            term_sum_carry, term_sum_no_carry = self._compute(term_1.val + term_2.val)            # adună suma la transportul curent            next_carry, total_with_carry = self._compute(term_sum_no_carry + saved_carry)            # salvează transportul            saved_carry = term_sum_carry + next_carry            # salvează totalul            if not root_node:                root_node = ListNode(total_with_carry)                root_append_func = self._get_append_func(root_node)            else:                root_append_func(total_with_carry)            # mergi mai departe            term_1 = term_1.next            term_2 = term_2.next        return root_node

Soluția mea nu este prea bună din cauza funcției _add_to_list, care parcurge root_node ca să adauge următoarea valoare. Nu știu încă cum să o optimizez.

ACTUALIZARE:

Am aflat despre nonlocal și am găsit o modalitate de a optimiza ușor codul meu:

    def _get_append_func(self, root):        _root = root        def __add_to_list(value):            nonlocal _root            _root.next = ListNode(value)            _root = _root.next        return __add_to_list

Mulțumesc că ai citit!