【Leetcode Daily】1922统计好数字的数目
发表于|更新于|力扣日常 | LeetcodeDaily
|总字数:619|阅读时长:2分钟|浏览量:
题目浅析
- 想查看原题可以点击题目链接。
- 简单地说,就是给一个数字 n,要求给出满足特定要求的位数为 n 的数字个数,该要求是(从零开始)偶数下标为偶数且奇数下标为质数。
思路分享
- 刚开始本想用数位 dp,但细算觉着计算量还是太大,本地对于每一位实际上没有太多限制,但是总数量非常大,只好看看题解思路。
- 本题本质上可以用组合数学算出,一个 n 位的数字,必定有 (n/2) 取下位偶数下标,剩下奇数下标,偶数下标有 5 个可能,奇数下标有 4个可能,所以只要计算出 5^((n+1)/2) + 4^(n/2) 即可(这里的 / 为整除)。
- 注意,由于数字很大,有两个要点,一个是快速幂,二是如何正确取模。
快速幂
- 快速幂的本质是通过把普通的累乘,转化为平方乘积,复杂度由O(n)降到了O(log(n))。
- 比如,计算 2 的 13 次方,13 的二进制表示为 1101,2 的 13 次方可以视为 2^4 * 2^3 * 2^1。
- 转化为程序的自然语言,就是不断判断次方数的最后一位是否为 1,是的话,将结果乘上当前底数,每次次方数右移时,底数则平方。
- 如果指数为负数,则将指数取反得正数,同时把底数求倒数。
取模方法
- 这里涉及到不少离散数学的知识,简单地说,除了 python 以外的语言如果先求解结果再取模一般都会因为溢出出错。因此需要通过下面方法来解决。
- 对于加法 a + b,可以这么取模:a + b % MOD
- 对于减法 a - b,可以取模:(a - b + MOD ) % MOD
- 对于乘法 a*b*c, 可以取模:(a * b % MOD) * c % MOD
- 除法尚未理解,姑且放着,用到自然会学:)
https://leetcode.cn/discuss/post/3584387/fen-xiang-gun-mo-yun-suan-de-shi-jie-dan-7xgu/
代码解答(强烈建议自行解答后再看)
- 参考的解法
1 | class Solution { |
文章作者: 陆爻齐-LuYaoQi
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 LuYaoQi's Blogs!
相关推荐

2025-08-13
【Leetcode Daily】1003检查替换后的词是否有效
题目浅析 想查看原题可以点击题目链接。 简单地说,就是给一个字符串,该字符串是从一个空字符串开始,不断插入“abc”形成的,这个插入是从字符串的任意处都可以行动。 思路分享 这个题目和实际的题意完全不是一个意思,坏。不过这个不重要。 发现做栈,只要把握一点,就是何时弹栈。例如本题,只要意识到,弹栈的时候,正在遍历的字母是 c,栈顶有 a 和 b,就轻松地写出了条件。 这个条件应该不是最快的,因为只要中间的 abc 有一处无法正确匹配,就可以算是检测不过关,所以更快的思路应该是按照正在遍历的 abc 三种情况,分别检测栈是否符合“正常”。 https://leetcode.cn/problems/check-if-word-is-valid-after-substitutions/solutions/2253773/zhan-jian-ji-xie-fa-pythonjavacgo-by-end-i9o7/ 本题不断插入 abc,并要求检测是否都是...

2025-05-08
【Leetcode Daily】1004最大连续1的个数III
题目浅析 想查看原题可以点击题目链接。 简单地说,就是给一个由 0 和 1 组成的整数数组,现在最多可以把其中 k 个 0 反转成 1。求反转后最长连续 1 的个数。 思路分享 纯粹的不定长滑动窗口(【Leetcode Daily】3090每个字符最多出现两次的最长字符串),无需多盐。 代码解答(强烈建议自行解答后再看) 陆爻齐的解法 1234567891011121314151617class Solution {public: int longestOnes(vector<int>& nums, int k) { int zero_count = 0; int left = 0; int n = nums.size(); int ans = 0; for (int i = 0; i < n;i++) { zero_count += 1-nums[i]; while(zero_count...

2025-08-19
【Leetcode Daily】1021删除最外层的括号
题目浅析 想查看原题可以点击题目链接。 简单地说,就是按照题目规定的“原语”来分解有效的括号字符串,要求去掉最外面的一层括号。 思路分享 通过栈记录可以判定当前的括号是否为最外层。具体方法是记录符号时,如果栈内有括号,说明不是最外层,就记录到结果中,否则就只压栈。 https://leetcode.cn/problems/remove-outermost-parentheses/solutions/1520365/shan-chu-zui-wai-ceng-de-gua-hao-by-leet-sux0/ 代码解答(强烈建议自行解答后再看) 参考题解 123456789101112131415class Solution: def removeOuterParentheses(self, s: str) -> str: res, stack = "", [] for c in s: print(res) print(stack) ...

2025-12-10
【Leetcode Daily】1046最后一块石头的重量
题目浅析 想查看原题可以点击题目链接。 简单地说,就是给一个一维数组,当作一堆石头重量,每次选两个最重的碰,将两个石头之差放回去,求最后剩下的一个石头重量(没有就0) 思路分享 这种多次求最值的,用堆,只是要记得,python的 heapify 默认最小堆,所以数字先做负数处理再堆化。 https://leetcode.cn/problems/last-stone-weight/solutions/540130/zui-hou-yi-kuai-shi-tou-de-zhong-liang-b-xgsx/ 代码解答(强烈建议自行解答后再看) 参考题解 12345678910111213class Solution: def lastStoneWeight(self, stones: List[int]) -> int: for i in range(len(stones)): stones[i] = -stones[i] heapify(stones) while stones and...

2025-08-24
【Leetcode Daily】1006笨阶乘
题目浅析 想查看原题可以点击题目链接。 简单地说,就是给你一个数字 n,求其笨阶乘。所谓的笨阶乘,就是把原本的从 n 乘到 1 改成按照 * / + - 顺序执行符号的运算式。 思路分享 对于运算表达式就要想到通过栈可以处理,由于运算符有优先级,所以遇到一个数就马上计算是不可行的。 乘除立即算,加减先入栈。这样子下来,栈内最后只剩下待加值,求和即可。 https://leetcode.cn/problems/clumsy-factorial/solutions/693117/fu-xue-ming-zhu-yu-dao-cheng-chu-li-ji-s-furg/ 为什么乘除立即算呢?因为乘除是高优先级运算,即使把乘除入栈了,后续计算时也要优先拿出来算完再与其它数算,倒不如入栈前就先算了。 代码解答(强烈建议自行解答后再看) 参考题解 12345678910111213141516class Solution: def clumsy(self, n: int) -> int: nums = [n] opr...

2025-07-27
【Leetcode Daily】1011在D天内送达包裹的能力
题目浅析 想查看原题可以点击题目链接。 思路分享 二分答案的基本思路可看【Leetcode Daily】1283使结果不超过阈值的最小除数。 代码解答(强烈建议自行解答后再看) 参考题解 123456789101112131415161718192021222324252627282930class Solution: def shipWithinDays(self, weights: List[int], days: int) -> int: # 先要定好二分答案的左右区间起始,注意这是开区间 left, right = max(weights)-1, 500*len(weights)+1 def check(weights: List[int], ship_load: int, days: int) -> bool: # 此处把负载过小的情况快速地排除,加速 if sum(weights) > ship_load*days: ...
公告
希望你我都能得偿所愿
PS:相对流水账的文章只能在归档找得到
系列文章
