leetcode之C#篇1

来源:互联网 发布:铁路 知乎 编辑:程序博客网 时间:2024/06/13 03:24

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


0 0
原创粉丝点击