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

Posted lxy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1012. 至少有 1 位重复的数字相关的知识,希望对你有一定的参考价值。

题目链接: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);
    
;

使用 Kotlin 验证密码 [重复]

【中文标题】使用 Kotlin 验证密码 [重复]【英文标题】:password validation with Kotlin [duplicate] 【发布时间】:2021-12-23 22:33:19 【问题描述】:

我是 Kotlin 的新手,并试图找到最优雅的密码验证解决方案:

    密码必须至少为 8 个字符。 必须至少有 1 个小写字母和至少 1 个大写字母。 它必须有一个特殊字符,例如!或 + 或 - 或类似 必须至少有 1 位数字

【问题讨论】:

【参考方案1】:

“优雅”是主观的!

这是一个函数式的方法:

// you can define each rule as a separate checking function,
// adding more doesn't change the complexity
fun String.isLongEnough() = length >= 8
fun String.hasEnoughDigits() = count(Char::isDigit) > 0
fun String.isMixedCase() = any(Char::isLowerCase) && any(Char::isUpperCase)
fun String.hasSpecialChar() = any  it in "!,+^" 

// you can decide which requirements need to be included (or make separate lists
// of different priority requirements, and check that enough of each have been met)
val requirements = listOf(String::isLongEnough, String::hasEnoughDigits)
val String.meetsRequirements get() = requirements.all  check -> check(this) 

fun main() 
    val password = "hiThere2!+"
    println(password.meetsRequirements)

我认为好处是添加新规则很容易,而且它们非常简单易读,并且您可以在单独的步骤中处理验证逻辑(例如,如果您正在实施“密码强度”指标,其中满足有些要求比其他要求更重要)。

我在那里使用了一些更高级的语言功能,但它确实是为了保持简洁。 String.whatever() 扩展函数只是意味着您不需要在函数中引用字符串参数(它是 this),而函数引用 (String::hasEnoughDigits) 让您可以执行 requirements.all 调用而不是去 @987654326 @ 等等。如果你愿意,你可以这样做!

有很多选择和方法来解决它。正则表达式绝对可以很优雅,但也很难使用

【讨论】:

【参考方案2】:

你可以这样做......

internal fun isValidPassword(password: String): Boolean 
        if (password.length < 8) return false
        if (password.filter  it.isDigit() .firstOrNull() == null) return false
        if (password.filter  it.isLetter() .filter  it.isUpperCase() .firstOrNull() == null) return false
        if (password.filter  it.isLetter() .filter  it.isLowerCase() .firstOrNull() == null) return false
        if (password.filter  !it.isLetterOrDigit() .firstOrNull() == null) return false

        return true
    

【讨论】:

以上是关于1012. 至少有 1 位重复的数字的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode至 少有 1 位重复的数字

Leetcode-1015 Numbers With Repeated Digits(至少有 1 位重复的数字)

使用 Kotlin 验证密码 [重复]

字符串类题目——滑动窗口和递归分治以及一些些位运算的结合

如何生成随机的五位数字Java [重复]

打印出列表中至少有一个公共数字的相邻数字