leetcode之C#篇1

leetcode之Strong Password Checker解法

这个问题的大概意思是检查密码强度,有三个要求

1.密码长度在6到20位之间

2.必须包含大小写字母和数字

3.不允许三个及以上重复字符

函数返回结果是将不符合的密码变成合适的密码所需要的操作次数,启动增减,修改,删除都算一次操作

这个问题,我的思路怎么都没有理清楚,但是代码通过了。

首先,分三种情况讨论,当小于等于20的时候,很容易搞定

而当大于20时候的删除,却是麻烦。第一次写C#语言就碰到这个问题,很难说清楚

不过这里的C#语言没有用到什么高深的知识,代码也很容易转化为C语言版的

public class Solution {
    public int StrongPasswordChecker(string s)
    {
        char[] pwd;
        int len,temp=0,t=0;
        pwd=s.ToCharArray();
        len=s.Length;
        if(len<6)
        {
            temp=6-len;
            t=number_check(pwd)+uppercase_check(pwd)+lowercase_check(pwd);
            return temp>=t?temp:t;
        }
        if(len<21)
        {
            temp=repeat_check(pwd);
            t=number_check(pwd)+uppercase_check(pwd)+lowercase_check(pwd);
            return temp>=t?temp:t;
        }
        else
        {
            List<int> repeat = new List<int>();
            int i=0,j;
            t=number_check(pwd)+uppercase_check(pwd)+lowercase_check(pwd);
            while(i<s.Length-1)
            {
                j=i+1;
                while(j<s.Length)
                {
                    if(s[i]==s[j])
                    {
                        j++;
                    }
                    else
                    {
                        break;
                    }
                }
                if(j-i>2)
                {
                    repeat.Add(j-i);
                }
                i=j;
            }
            int delete=len-20;
            repeat.Sort();
            for(int m=0;m<repeat.Count;m++)
            {
                if(delete>=(repeat[m]%3+1))
                {
                    delete-=1+repeat[m]%3;
                    repeat[m]-=1+repeat[m]%3;
                }
                if(delete==0)
                {
                    break;
                }
            }   
            if(delete>0)
            {
                for(int n=0;n<repeat.Count;n++)
                {
                    while(repeat[n]>2)
                    {
                        if(delete>2)
                        {
                            repeat[n]-=3;
                            delete-=3;
                        }
                        else
                        {
                            repeat[n]-=delete;
                            delete=0;
                        }
                        if(delete==0)
                        {
                            break;
                        }
                    }
                    if(delete==0)
                    {
                        break;
                    }
                }
            }
            foreach (var item in repeat)
            {
                temp+=item/3;
            }           
            return len-20+(temp>t?temp:t);
        }
    }
    public int repeat_check(char[] s)
    {   
        int i=0,t=0;
        while(i<s.Length-2)
        {
            if(s[i]==s[i+1]&&s[i]==s[i+2])
            {
                t++;
                i+=3;
                continue;
            }
            i++;
        }
        return t;
    }
    public int number_check(char[] s)
    {
        int i=0;
        for(i=0;i<s.Length;i++)
        {
            if(s[i]>='0'&&s[i]<='9')
            {
                return 0;
            }
        }
        return 1;
    }
    public int uppercase_check(char[] s)
    {
        int i=0;
        for(i=0;i<s.Length;i++)
        {
            if(s[i]>='A'&&s[i]<='Z')
            {
                return 0;
            }
        }
        return 1;   
    }
    public int lowercase_check(char[] s)
    {
        int i=0;
        for(i=0;i<s.Length;i++)
        {
            if(s[i]>='a'&&s[i]<='z')
            {
                return 0;
            }
        }
        return 1;   
    }
}

更多leetcode问题源码,请查看我的github地址https://github.com/Jum1023/leetcode


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值