返回
通俗易懂:大数相加的三种解法,入门到精通!
前端
2024-02-29 11:24:18
作为算法面试中的常客,大数相加可谓是既经典又令人头疼。但别担心,掌握了这三种解法,它分分钟就能从你的拦路虎变成垫脚石!
常规解法
该方法简单直接,适用于大多数情况。
思路
- 将两个大数转换为字符串。
- 从后向前遍历两个字符串,逐位相加。
- 如果进位不为 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:字符串拼接
这是一种巧妙的解法,将两个大数转换为字符串,然后直接拼接。
思路
- 将两个大数转换为字符串。
- 在较短的字符串前面补足 0。
- 将两个字符串拼接起来。
代码示例(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:链表反转
这种解法利用链表的特性,将大数表示为链表,然后反转链表进行相加。
思路
- 将两个大数转换为链表,其中每个节点代表一位。
- 反转两个链表。
- 将两个反转后的链表相加,并记录进位。
代码示例(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 利用链表特性,适用于大数据量的情况。掌握了这三种解法,你就能轻松应对大数相加面试难题,在算法面试中大展身手!