华为OJ平台——密码强度等级
题目描述:
密码按如下规则进行计分,并根据不同的得分为密码进行安全等级划分。
一、密码长度:
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语句的逻辑判断,算法层面的考察很少。
import java.util.Scanner;
public class GetPwdSecurityLevel {
public static void main(String[] args) {
Scanner cin = new Scanner(System.in) ;
String password = cin.nextLine() ;
cin.close() ;
SecurityLevel res = getPwdSecurityLevel(password) ;
System.out.println(res.name()) ;
}
/**
* 其实对于这样一个等级评定,
* 主要考察的是密码字符串的长度、大写字母个数、小写字母个数、数字个数以及符号个数
* 然后根据这些标准来判断得分,最后根据得分来确定等级
* @param password
* @return
*/
private static SecurityLevel getPwdSecurityLevel(String password) {
int len = password.length() ;
int countUpper = 0 ;
int countLower = 0 ;
int countNum = 0 ;
int countSym = 0 ;
int score = 0 ;
char temp ;
for(int i = 0 ; i < len ; i++){
temp = password.charAt(i) ;
if((temp <= 'Z') && (temp >= 'A')){
//大写字母个数
countUpper++ ;
}else if((temp <= 'z') && (temp >= 'a')){
//小写字母个数
countLower++ ;
}else if((temp <= '9') && (temp >= '0')){
//数字个数
countNum++ ;
}else if(((temp >= 0x21) && (temp <= 0x2F)) ||
((temp >= 0x3A) && (temp <= 0x40)) ||
((temp >= 0x7B) && (temp <= 0x7E))){
//符号个数
countSym++ ;
}
}
//计算根据长度判断的得分
if(len <= 4){
score += 5 ;
}else if((len <= 7) && (len > 4)){
score += 10 ;
}else{
score += 25 ;
}
//计算根据字母情况判断得分
if(((countUpper != 0) && (countLower == 0)) ||
((countUpper == 0) && (countLower != 0))){
score += 10 ;
}else if((countUpper != 0) && (countLower != 0)){
score += 20 ;
}
//计算根据数字个数判断得分
if(countNum == 1){
score += 10 ;
}else if(countNum > 1){
score += 20 ;
}
//计算根据符号个数判断的得分
if(countSym == 1){
score += 10 ;
}else if(countSym > 1){
score += 25 ;
}
//计算奖励的判断得分
if((countUpper != 0) && (countLower != 0) &&
(countNum != 0) && (countSym != 0)){
score += 5 ;
}else if(((countUpper + countLower) != 0) &&
(countNum != 0) && (countSym != 0)){
score += 3 ;
}else if(((countUpper + countLower) != 0) &&
(countNum != 0) && (countSym == 0)){
score += 2 ;
}
//根据得分确定最后的评级,并返回
if(score >= 90){
return SecurityLevel.VERY_SECURE ;
}else if(score >= 80){
return SecurityLevel.SECURE ;
}else if(score >= 70){
return SecurityLevel.VERY_STRONG ;
}else if(score >= 60){
return SecurityLevel.STRONG ;
}else if(score >= 50){
return SecurityLevel.AVERAGE ;
}else if(score >= 25){
return SecurityLevel.WEAK ;
}else{
return SecurityLevel.VERY_WEAK ;
}
}
}
/**
* 安全评级用枚举类型表示
*/
enum SecurityLevel{
VERY_WEAK,
WEAK,
AVERAGE,
STRONG,
VERY_STRONG,
SECURE,
VERY_SECURE
}
华为OJ平台——密码强度等级的更多相关文章
- 华为OJ平台——字符串分隔
题目描述: 连续输入字符串,请按长度为8拆分每个字符创 后输出到新的字符串数组: 长度不是8整数倍的字符串请在后面补数字0,空字符串不处理 输入 连续输入字符串(输入两次,每个字符长长度小于100)输 ...
- 华为OJ平台——输出最小的k个数
输入n个整数,输出其中最小的k个. 详细描述: 接口说明 原型: bool GetMinK(unsignedint uiInputNum, int *pInputArray, unsignedint ...
- 华为OJ平台——矩阵乘法
题目描述: 如果A是个x行y列的矩阵,B是个y行z列的矩阵,把A和B相乘,其结果将是另一个x行z列的矩阵C. 输入: 1.第一个矩阵的行数 2.第一个矩阵的列数(也是第二个矩阵的行数) 3.第二个矩阵 ...
- 华为OJ平台——求最大连续bit数
题目描述: 求一个byte数字对应的二进制数字中1的最大连续数,例如3的二进制为00000011,最大连续2个1 输入: 一个byte型的数字 输出: 对应的二进制数字中1的最大连续数 思路: ...
- 华为OJ平台——统计字符串中的大写字母
题目描述: 统计字符串中的大写字母的个数 输入: 一行字符串 输出: 字符串中大写字母的个数(当空串时输出0) 思路: 这一题很简单,直接判断字符串中的每一个字符即可,唯一要注意的一点是输入的字符串可 ...
- 华为OJ平台——将真分数分解为埃及分数
题目描述: 分子为1的分数称为埃及分数.现输入一个真分数(分子比分母小的分数,叫做真分数),请将该分数分解为埃及分数.如:8/11 = 1/2+1/5+1/55+1/110. 输入: 输入一个真分数, ...
- 华为OJ平台——字符串匹配
题目描述: 判断短字符串中的所有字符是否在长字符串中全部出现 输入: 输入两个字符串. 第一个为短字符,第二个为长字符 输出: true - 表示短字符串中所有字符均在长字符串中出现 false - ...
- 华为OJ平台——整形数组合并
题目描述: 将两个整型数组按照升序合并,并且过滤掉重复数组元素 输入: 输入说明,按下列顺序输入: 1 输入第一个数组的个数 2 输入第一个数组的数值 3 输入第二个数组的个数 4 输入第二个数组的数 ...
- 华为OJ平台——计算字符串的相似度
题目描述: 对于不同的字符串,我们希望能有办法判断相似程度,我们定义了一套操作方法来把两个不相同的字符串变得相同,具体的操作方法如下: 1 修改一个字符,如把“a”替换为“b”. 2 增加一个字符,如 ...
随机推荐
- 关于List泛型的强制转换
当我们从数据库中查询出一些数据,有时返回的结果可能是List<Object>类型,而我们清楚的知道它的准确类型是List<User>,可能我们想直接的去进行类型的转换,你可能会 ...
- ADF_Database Develop系列3_通过UML进行数据库开发之将Database Diagram转为Class Diagram
2013-05-01 Created By BaoXinjian
- 实现图片的2次缩放后再进行candy边缘检测
//实现图片的2次缩放后再进行candy边缘检测//Author:SD//Date:2015-9-27#include "cv.h"#include "highgui.h ...
- xss 和 csrf攻击详解
在那个年代,大家一般用拼接字符串的方式来构造动态 SQL 语句创建应用,于是 SQL 注入成了很流行的攻击方式.在这个年代, 参数化查询 已经成了普遍用法,我们已经离 SQL 注入很远了.但是,历史同 ...
- storyBoard中切换应用启动的切入点方法
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launc ...
- 衔接UI线程和管理后台工作线程的类(多线程、异步调用)
一个不错的UI多线程操作类 http://www.cnblogs.com/net66/archive/2005/08/03/206132.html
- Oracle迁移MySQL笔记
1,--在oracle代表注释 ,mysql/* */,# 2,|| oracle里面是表示连接符号,比如 A||B 那么就是AB 3,databaseLink创建好之后,比如名字为db_link_b ...
- 离线安装PM2
因为要部署应用的机器没有公网连接,所以直接npm install pm2是不可能了, 简单记录一下怎么离线安装pm2 首先,找一台可以在线安装pm2的机器 执行 npm install pm2 -g ...
- SQL Server 2005中的分区表(五):添加一个分区(转)
所谓天下大事,分久必合,合久必分,对于分区表而言也一样.前面我们介绍过如何删除(合并)分区表中的一个分区,下面我们介绍一下如何为分区表添加一个分区. 为分区表添加一个分区,这种情况是时常会 发生的.比 ...
- Golang 图片上绘制文字
之前介绍过使用 FreeType-go 来绘制字(http://www.cnblogs.com/ghj1976/p/3445568.html), 现在相关的包被做了整合,主要是整合到了 github ...