大数的处理是算法中很常见的问题,关键是笔试也容易考,记录一下常见的考法
快速幂
leetcode 5802. 统计好数字的数目
题目
我们称一个数字字符串是 好数字 当它满足(下标从 0 开始)偶数 下标处的数字为 偶数 且 奇数 下标处的数字为 质数 (2,3,5 或 7)。
比方说,”2582” 是好数字,因为偶数下标处的数字(2 和 8)是偶数且奇数下标处的数字(5 和 2)为质数。但 “3245” 不是 好数字,因为 3 在偶数下标处但不是偶数。
给你一个整数 n ,请你返回长度为 n 且为好数字的数字字符串 总数 。由于答案可能会很大,请你将它对 10^9 + 7 取余后返回 。
一个 数字字符串 是每一位都由 0 到 9 组成的字符串,且可能包含前导 0 。
思路
关键是题目给的n特别大,遇到这种数字特别大的情况,需要考虑快速幂求解。
对于偶数下标处的数字,它可以为 0,2,4,6,8 共计 5 种,而长度为 n 的数字字符串有 ⌊(n+1)/2⌋个偶数下标.
对于奇数下标处的数字,它可以为 2,3,5,7 共计 4 种,而长度为 n 的数字字符串有 ⌊n/2⌋个奇数下标。
因此长度为 n 的数字字符串中,好数字的总数即为:5^⌊(n+1)/2⌋*4^⌊n/2⌋
在本题中,由于 n 的取值最大可以到 10^15,如果通过普通的乘法运算直接求出上式中的幂,会超出时间限制,因此我们需要使用快速幂算法对幂的求值进行优化。
题解
1 | class Solution { |
全排列
leetcode 面试题17. 打印从 1 到最大的 n 位数
题目
输入数字 n
,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999
思路
本身其实不难,因为简单题所以时间复杂度要求不高,但是面试中多半会考虑大数的情况,所以需要使用全排列。
题解
1 | public class Solution { |
利用链表实现大数相加
leetcode2 两数相加
题目
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
思路
注意是逆序存储,考虑进位即可。
如果是正序,可以先原地反转链表。
题解
1 | class Solution { |
本文链接: http://woaixiaoyuyu.github.io/2021/07/04/%E5%A4%A7%E6%95%B0%E5%A4%84%E7%90%86/
版权声明: 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!