LeetCode: Add Two Numbers, soluție iterativă în Python 3
- 1 minute de citit
- 3 exemple de cod
Disponibil și în English
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_nodeSoluț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_listMulțumesc că ai citit!