题目描述:  

  密码按如下规则进行计分,并根据不同的得分为密码进行安全等级划分。

一、密码长度:

  5 分: 小于等于4 个字符

  10 分: 5 到7 字符

  25 分: 大于等于8 个字符

二、字母:

  0 分: 没有字母

  10 分: 全都是小(大)写字母

  20 分: 大小写混合字母

三、数字:

  0 分: 没有数字

   10 分: 1 个数字

  20 分: 大于1 个数字

四、符号:

  0 分: 没有符号

  10 分: 1 个符号

   25 分: 大于1 个符号

五、奖励:

  2 分: 字母和数字

  3 分: 字母、数字和符号

   5 分: 大小写字母、数字和符号

最后的评分标准:

   >= 90: 非常安全

   >= 80: 安全(Secure)

   >= 70: 非常强

  >= 60: 强(Strong)

  >= 50: 一般(Average)

  >= 25: 弱(Weak)

  >= 0:  非常弱

  对应输出为:

    VERY_WEAK,

   WEAK,

   AVERAGE,

    STRONG,

    VERY_STRONG,

    SECURE,

   VERY_SECURE

请根据输入的密码字符串,进行安全评定。

注:

字母:a-z, A-Z

数字:-9

符号包含如下: (ASCII码表可以在UltraEdit的菜单view->ASCII Table查看)

!"#$%&'()*+,-./     (ASCII码:x21~0x2F)

:;<=>?@             (ASCII<=><=><=><=><=>码:x3A~0x40)

[\]^_`              (ASCII码:x5B~0x60)

   {|}~                (ASCII码:x7B~0x7E)

输入:

  输入一个string的密码(eg:38$@NoNoNo)

输出:

  输出密码等级(eg:VERY_SECURE)

思路:

  其实对于这样一个等级评定,主要考察的是密码字符串的长度、大写字母个数、小写字母个数、数字个数以及符号个数,然后根据这些标准来判断得分,最后根据得分来确定等级就可以了。主要是一些if语句的逻辑判断,算法层面的考察很少。

  1. import java.util.Scanner;
  2.  
  3. public class GetPwdSecurityLevel {
  4.  
  5. public static void main(String[] args) {
  6. Scanner cin = new Scanner(System.in) ;
  7. String password = cin.nextLine() ;
  8. cin.close() ;
  9.  
  10. SecurityLevel res = getPwdSecurityLevel(password) ;
  11. System.out.println(res.name()) ;
  12.  
  13. }
  14.  
  15. /**
  16. * 其实对于这样一个等级评定,
  17. * 主要考察的是密码字符串的长度、大写字母个数、小写字母个数、数字个数以及符号个数
  18. * 然后根据这些标准来判断得分,最后根据得分来确定等级
  19. * @param password
  20. * @return
  21. */
  22. private static SecurityLevel getPwdSecurityLevel(String password) {
  23. int len = password.length() ;
  24. int countUpper = 0 ;
  25. int countLower = 0 ;
  26. int countNum = 0 ;
  27. int countSym = 0 ;
  28.  
  29. int score = 0 ;
  30. char temp ;
  31. for(int i = 0 ; i < len ; i++){
  32. temp = password.charAt(i) ;
  33. if((temp <= 'Z') && (temp >= 'A')){
  34. //大写字母个数
  35. countUpper++ ;
  36. }else if((temp <= 'z') && (temp >= 'a')){
  37. //小写字母个数
  38. countLower++ ;
  39. }else if((temp <= '9') && (temp >= '0')){
  40. //数字个数
  41. countNum++ ;
  42. }else if(((temp >= 0x21) && (temp <= 0x2F)) ||
  43. ((temp >= 0x3A) && (temp <= 0x40)) ||
  44. ((temp >= 0x7B) && (temp <= 0x7E))){
  45. //符号个数
  46. countSym++ ;
  47. }
  48. }
  49.  
  50. //计算根据长度判断的得分
  51. if(len <= 4){
  52. score += 5 ;
  53. }else if((len <= 7) && (len > 4)){
  54. score += 10 ;
  55. }else{
  56. score += 25 ;
  57. }
  58. //计算根据字母情况判断得分
  59. if(((countUpper != 0) && (countLower == 0)) ||
  60. ((countUpper == 0) && (countLower != 0))){
  61. score += 10 ;
  62. }else if((countUpper != 0) && (countLower != 0)){
  63. score += 20 ;
  64. }
  65. //计算根据数字个数判断得分
  66. if(countNum == 1){
  67. score += 10 ;
  68. }else if(countNum > 1){
  69. score += 20 ;
  70. }
  71. //计算根据符号个数判断的得分
  72. if(countSym == 1){
  73. score += 10 ;
  74. }else if(countSym > 1){
  75. score += 25 ;
  76. }
  77. //计算奖励的判断得分
  78. if((countUpper != 0) && (countLower != 0) &&
  79. (countNum != 0) && (countSym != 0)){
  80. score += 5 ;
  81. }else if(((countUpper + countLower) != 0) &&
  82. (countNum != 0) && (countSym != 0)){
  83. score += 3 ;
  84. }else if(((countUpper + countLower) != 0) &&
  85. (countNum != 0) && (countSym == 0)){
  86. score += 2 ;
  87. }
  88. //根据得分确定最后的评级,并返回
  89. if(score >= 90){
  90. return SecurityLevel.VERY_SECURE ;
  91. }else if(score >= 80){
  92. return SecurityLevel.SECURE ;
  93. }else if(score >= 70){
  94. return SecurityLevel.VERY_STRONG ;
  95. }else if(score >= 60){
  96. return SecurityLevel.STRONG ;
  97. }else if(score >= 50){
  98. return SecurityLevel.AVERAGE ;
  99. }else if(score >= 25){
  100. return SecurityLevel.WEAK ;
  101. }else{
  102. return SecurityLevel.VERY_WEAK ;
  103. }
  104.  
  105. }
  106.  
  107. }
  108.  
  109. /**
  110. * 安全评级用枚举类型表示
  111. */
  112. enum SecurityLevel{
  113. VERY_WEAK,
  114. WEAK,
  115. AVERAGE,
  116. STRONG,
  117. VERY_STRONG,
  118. SECURE,
  119. VERY_SECURE
  120. }

华为OJ平台——密码强度等级的更多相关文章

  1. 华为OJ平台——字符串分隔

    题目描述: 连续输入字符串,请按长度为8拆分每个字符创 后输出到新的字符串数组: 长度不是8整数倍的字符串请在后面补数字0,空字符串不处理 输入 连续输入字符串(输入两次,每个字符长长度小于100)输 ...

  2. 华为OJ平台——输出最小的k个数

    输入n个整数,输出其中最小的k个. 详细描述: 接口说明 原型: bool GetMinK(unsignedint uiInputNum, int *pInputArray, unsignedint ...

  3. 华为OJ平台——矩阵乘法

    题目描述: 如果A是个x行y列的矩阵,B是个y行z列的矩阵,把A和B相乘,其结果将是另一个x行z列的矩阵C. 输入: 1.第一个矩阵的行数 2.第一个矩阵的列数(也是第二个矩阵的行数) 3.第二个矩阵 ...

  4. 华为OJ平台——求最大连续bit数

    题目描述: 求一个byte数字对应的二进制数字中1的最大连续数,例如3的二进制为00000011,最大连续2个1 输入: 一个byte型的数字    输出: 对应的二进制数字中1的最大连续数 思路: ...

  5. 华为OJ平台——统计字符串中的大写字母

    题目描述: 统计字符串中的大写字母的个数 输入: 一行字符串 输出: 字符串中大写字母的个数(当空串时输出0) 思路: 这一题很简单,直接判断字符串中的每一个字符即可,唯一要注意的一点是输入的字符串可 ...

  6. 华为OJ平台——将真分数分解为埃及分数

    题目描述: 分子为1的分数称为埃及分数.现输入一个真分数(分子比分母小的分数,叫做真分数),请将该分数分解为埃及分数.如:8/11 = 1/2+1/5+1/55+1/110. 输入: 输入一个真分数, ...

  7. 华为OJ平台——字符串匹配

    题目描述: 判断短字符串中的所有字符是否在长字符串中全部出现 输入: 输入两个字符串. 第一个为短字符,第二个为长字符 输出: true  - 表示短字符串中所有字符均在长字符串中出现 false - ...

  8. 华为OJ平台——整形数组合并

    题目描述: 将两个整型数组按照升序合并,并且过滤掉重复数组元素 输入: 输入说明,按下列顺序输入: 1 输入第一个数组的个数 2 输入第一个数组的数值 3 输入第二个数组的个数 4 输入第二个数组的数 ...

  9. 华为OJ平台——计算字符串的相似度

    题目描述: 对于不同的字符串,我们希望能有办法判断相似程度,我们定义了一套操作方法来把两个不相同的字符串变得相同,具体的操作方法如下: 1 修改一个字符,如把“a”替换为“b”. 2 增加一个字符,如 ...

随机推荐

  1. 将网站部署到windows2003 iis6之后,出现asp.net程序页面无法访问情况

    idc的技术说是没有装.net framework 2.0的缘故. 可是我已经装了4.0. 后来把一个伪静态的组件卸载了,就可以了.

  2. de.greenrobot.event.EventBusException: Subscriber class dji.midware.a.e already registered to event class

    java.lang.RuntimeException: Unable to create application com.android.tools.fd.runtime.BootstrapAppli ...

  3. MFC的类层次结构图

  4. RPC介绍

    转载http://blog.csdn.net/mindfloating/article/details/39474123/ 近几年的项目中,服务化和微服务化渐渐成为中大型分布式系统架构的主流方式,而 ...

  5. Java Cookie和Session(转载)

    一.cookie机制和session机制的区别 具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案. 同时我们也看到,由于才服务器端保持状态的 ...

  6. 利用js将 json对象在textarea中赋值与展示

    明明很简单的东西,可惜网上一大堆废话.在此记录,转需. jsonStr = JSON.stringify(jsondata,); example: <!doctype html> < ...

  7. 常用开源Jabber(XMPP) IM服务器介绍(转)

      1. Openfire (Wildfire) 3.x授权: GPL or 商用操作系统平台:所有(使用Java开发)XMPP Jabber 协议实现情况:98%Tim 评价:安装和使用非常简单,安 ...

  8. linux下安装nginx、pcre、zlib、openssl

    1.安装nginx之前需要安装PCRE库的安装  最新下载地址   ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/ tar –zxvf p ...

  9. C++学习40 抛出自己的异常

    throw 是C++中的关键字,用来抛出异常.如果不使用 throw 关键字,try 就什么也捕获不到:上节提到的 at() 函数在内部也使用了 throw 关键字来抛出异常. throw 既可以用在 ...

  10. Python 之字节转换

    # coding: utf-8 def bytes2human(n): """ >>> bytes2human(10000) 9K >>&g ...