e840 - P7. 密碼強度測試(Passwords)
題目描述
題目要求計算密碼強度,根據密碼中字母、數字的數量以及連續數字的數量進行加減分。密碼長度、是否包含字母和數字、是否達到最低要求(長度>=8,包含字母和數字)都會影響最終得分。
解題思路
程式碼遍歷密碼字串,統計字母、數字的數量,並檢查連續數字的數量。根據題目規則,對每個字元進行加分或減分。最後,根據密碼是否達到最低要求進行額外加分或減分。程式使用貪心策略,逐字計算得分,並在遍歷過程中更新總分。
複雜度分析
- 時間複雜度: O(n),其中 n 是密碼的長度。程式需要遍歷密碼字串一次。
- 空間複雜度: O(1),程式使用固定數量的變數來儲存計數和總分,不隨輸入大小變化。
程式碼
#include <iostream>
using namespace std;
int main(){
string a;
cin >> a;
int al=a.length(),nn=0,ans=al*3,en=0,nall=0;
bool n=0;
for(int i=0;i<al;++i){
if(a[i]>='0'&&a[i]<='9'){
n=1;
++nn;
++nall;
}
else{
if(nn>1)
ans-=(nn-1)*2;
nn=0;
}
if((a[i]>='a'&&a[i]<='z')||(a[i]>='A'&&a[i]<='Z'))
++en;
}
if(nn>1)ans-=(nn-1)*2;
ans+=en*3;
ans+=nall*2;
if(al>=8&&en!=0&&n==1)
ans+=10;
else
ans-=5;
if(en==0&&n)
ans-=al;
if(en&&n==0)
ans-=al;
cout << ans ;
}