首页 > 其他分享 >1012. 至少有 1 位重复的数字

1012. 至少有 1 位重复的数字

时间:2023-04-08 23:44:34浏览次数:54  
标签:数字 重复 cache mask isNum isLimit int 1012

题目链接:1012. 至少有 1 位重复的数字

方法:数位dp

解题思路

参考:数位 DP 通用模板,附题单(Python/Java/C++/Go)
注意:其中\(isNum\)是用来针对前导\(0\)可能影响结果而设置的标志,如\(010\)(即\(10\))实际是没有重复的数字,而由于前导\(0\)的影响使得是有重复的数字。对于不受前导\(0\)影响的数位\(dp\),则不需要设置\(isNum\)标志,例如:
233.数字 1 的个数
面试题 17.06. 2出现的次数

代码

class Solution {
public:
    int numDupDigitsAtMostN(int n) {
        string s = to_string(n);
        int m = s.length(), cache[m][1 << 10]; // 记忆化i:当前的位置 和 mask:二进制掩码,判断哪些数字被用过,记录该种情况下的数量,使得不用继续递归下去做重复的计算。
        memset(cache, -1, sizeof(cache));
        function<int(int, int, bool, bool)> f = [&](int i, int mask, bool isLimit, bool isNum) -> int {
            if (i == m) return isNum; // isNum == true,表示当前组成的数字合法
            if (!isLimit && isNum && cache[i][mask] != -1) return cache[i][mask];
            int res = 0;
            if (!isNum) res = f(i + 1, mask, false, false);
            int up = isLimit ? s[i] - '0' : 9;
            for (int d = 1 - isNum; d <= up; d ++ ) {
                if ((mask >> d & 1) == 0) 
                    res += f(i + 1, mask | (1 << d), d == up && isLimit, true);
            }
            if (!isLimit && isNum) cache[i][mask] = res;
            return res;
        };
        return n - f(0, 0, true, false);
    }
};

标签:数字,重复,cache,mask,isNum,isLimit,int,1012
From: https://www.cnblogs.com/lxycoding/p/17299593.html

相关文章

  • 什么是数字广告领域的 OCPM 模型?
    在数字广告领域,OCPM是指"OptimizedCostperMille",即每千次展示优化成本。它是Facebook广告平台中的一种出价策略,旨在通过机器学习算法自动优化广告出价,从而实现最佳广告效果和最低的成本。在OCPM出价策略下,广告主可以设定一个最高出价,并指定一个目标成果,例如广告的点击量......
  • 面试题 17.05. 字母与数字
    题目链接:面试题17.05.字母与数字方法:TwoSum解题思路(1)将字符量化为\(+1\),数字量化为\(-1\),那么当子数组的和\(subSum=0\)时,表示子数组中的字符和数字的数量相等;(2)\(subSum=s[j]-s[i],j>=i,i=1,2,...\),\(s[i]\)表示前\(i\)个元素的和;(3)即找\(s[j]-s[i]=0\),也即......
  • 分析以下数字的规律1 1 2 3 5 8 13 21用Python语言编程实现输出,此为斐波那契数列
    方法一:list1=[]#定义一个空列表foriinrange(15):#遍历语句循环15次ifi==0ori==1:#前两个数字的值都是1list1.append(1)#print(list1)else:list1.append(list1[i-1]+list1[i-2])print(list1)方法二:list1=[1,......
  • 在 PostgreSQL 中使用 EXCLUDE 值进行 Upsert(重复更新时插入、合并)
    上次,我们读到了如何在PostgreSQL中使用 UPSERT。在快速回顾中,UPSERT 是 INSERTONDUPLICATEUPDATE 的缩写,如果它们与以前的条目不匹配,则倾向于将 INSERT 值插入表中。如果有,它们会自动更新。PostgreSQL中的 EXCLUDED 是什么EXCLUDED 是DBMS给一个特殊表的名称,......
  • 数字营销(二)如何确定付费客户特征?
    一、为什么要确定付费客户特征?先讲个案例,以Shopify网站为例进行分析。该网站提供了许多功能,围绕着潜在客户在全生命周期中所需的业务需求,包括从创建业务开始、赚取收益等整个闭环链上所需的任何工具,如:开始做生意:Businessnamegenerator在线工具、域名选择页面、BusinessPl......
  • 中国企业数字化转型服务产业图谱
    2020年中国企业数字化转型服务产业图谱(来自艾瑞咨询-2021年中国企业数字化转型路径研究报告)......
  • 剑指offer03(Java)-数组中重复的数字(简单)
    题目:找出数组中重复的数字。在一个长度为n的数组nums里的所有数字都在0~n-1的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。示例1:输入:[2,3,1,0,2,5,3]输出:2或3 限制:2<=n<=1000......
  • 26. 删除有序数组中的重复项 & 80. 删除有序数组中的重复项 II
    力扣题目链接(26)给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。由于在某些语言中不能改变数组的长度,所以必须将结果放在数组nums的第一部分。更规范地说,如果在删除重......
  • 可编程逻辑器件和数字系统设计初步
    可编程逻辑器件传统通用逻辑器件:逻辑规模小、占用印刷板面积大、功耗大、可靠性低专用集成电路ASIC(ApplicationSpecificIntegratedCircuit),针对特定用途可编程逻辑器件PLD(ProgrammableLogicDevice),属于ASIC:可由设计者自己完成逻辑功能,系统集成度高、可靠性高、设计过程灵活......
  • 删除重复元素
    linkcode#include<iostream>#include<unordered_map>usingnamespacestd;intmain(){ unordered_map<char,int>mp; strings; cin>>s; for(inti=0;i<s.size();i++){ mp[s[i]]++; } stringtp=""; for(inti......