返回

通俗易懂:大数相加的三种解法,入门到精通!

前端

作为算法面试中的常客,大数相加可谓是既经典又令人头疼。但别担心,掌握了这三种解法,它分分钟就能从你的拦路虎变成垫脚石!

常规解法

该方法简单直接,适用于大多数情况。

思路

  1. 将两个大数转换为字符串。
  2. 从后向前遍历两个字符串,逐位相加。
  3. 如果进位不为 0,将其加到下一位的和中。

代码示例(Python)

def add_large_numbers(num1, num2):
  result = ""
  carry = 0
  
  # 逆序遍历两个字符串
  i = len(num1) - 1
  j = len(num2) - 1
  
  while i >= 0 or j >= 0 or carry:
    digit1 = int(num1[i]) if i >= 0 else 0
    digit2 = int(num2[j]) if j >= 0 else 0
    
    # 计算和与进位
    total = digit1 + digit2 + carry
    carry = total // 10
    result += str(total % 10)
    
    # 更新索引
    i -= 1
    j -= 1
  
  return result[::-1]

清奇思路 1:字符串拼接

这是一种巧妙的解法,将两个大数转换为字符串,然后直接拼接。

思路

  1. 将两个大数转换为字符串。
  2. 在较短的字符串前面补足 0。
  3. 将两个字符串拼接起来。

代码示例(Python)

def add_large_numbers(num1, num2):
  # 补足 0
  shorter, longer = (num1, num2) if len(num1) < len(num2) else (num2, num1)
  shorter = '0' * (len(longer) - len(shorter)) + shorter
  
  return str(int(shorter) + int(longer))

清奇思路 2:链表反转

这种解法利用链表的特性,将大数表示为链表,然后反转链表进行相加。

思路

  1. 将两个大数转换为链表,其中每个节点代表一位。
  2. 反转两个链表。
  3. 将两个反转后的链表相加,并记录进位。

代码示例(Python)

class ListNode:
  def __init__(self, val):
    self.val = val
    self.next = None

def add_large_numbers(num1, num2):
  head1 = create_list(num1)
  head2 = create_list(num2)
  
  # 反转链表
  head1 = reverse_list(head1)
  head2 = reverse_list(head2)
  
  # 相加
  carry = 0
  head = None
  while head1 or head2 or carry:
    digit1 = head1.val if head1 else 0
    digit2 = head2.val if head2 else 0
    
    total = digit1 + digit2 + carry
    carry = total // 10
    node = ListNode(total % 10)
    node.next = head
    head = node
    
    # 更新指针
    head1 = head1.next if head1 else None
    head2 = head2.next if head2 else None
  
  return head

def create_list(num):
  head = ListNode(int(num[-1]))
  for digit in num[-2::-1]:
    node = ListNode(int(digit))
    node.next = head
    head = node
  return head

def reverse_list(head):
  prev = None
  current = head
  while current:
    next_node = current.next
    current.next = prev
    prev = current
    current = next_node
  return prev

结语

大数相加的三种解法各有优劣。常规解法简单易懂,适用性强;清奇思路 1 巧妙直接,简洁高效;清奇思路 2 利用链表特性,适用于大数据量的情况。掌握了这三种解法,你就能轻松应对大数相加面试难题,在算法面试中大展身手!