d535 - 2. 密碼驗證與擷取
題目描述
題目要求驗證輸入的字串是否符合特定規則,如果符合則提取字串中的偶數數字組成密碼。規則包括:字串長度在 10 到 30 之間,僅包含數字 1 到 9,是迴文串,且相鄰數字滿足後面的數字不超過前面數字的兩倍。如果字串不符合規則,輸出 "INCORRECT"。如果字串符合規則但沒有偶數,輸出 "0"。
解題思路
程式首先檢查字串長度是否在有效範圍內。然後,它依次檢查字串是否為迴文串,相鄰數字是否滿足條件,以及是否包含偶數數字。如果所有條件都滿足,程式會遍歷字串,提取偶數數字並輸出。如果字串不符合任何一個條件,程式會輸出 "INCORRECT"。如果字串符合所有條件但沒有偶數,程式會輸出 "0"。
複雜度分析
- 時間複雜度: O(n),其中 n 是字串的長度。程式需要遍歷字串多次來檢查迴文、相鄰數字的關係以及提取偶數。
- 空間複雜度: O(1),程式使用的額外空間是常數級別,不隨字串長度變化。
程式碼
#include <iostream>
#include <string>
using namespace std;
int main(){
string a;
while(cin >> a){
if(a.length()<10||a.length()>30)
cout << "INCORRECT\n";
else{
bool ans=0;
for(int i=a.length()-1;i>=0&&ans==0;i--)
if(a[i]>'9'||a[i]<'1')
ans=1;
for(int i=0;i<a.length()&&ans==0;i++)
if(a[i]!=a[a.length()-i-1])
ans=1;
for(int i=1;i<a.length()&&ans==0;i++)
if((a[i]-48)>(a[i-1]-48)*2)
ans=1;
if(ans==0){
bool z=0;
for(int i=0;i<a.length();i++){
if((a[i]-48)%2==0){
cout << a[i];
z=1;
}
}
if(z==0)
cout << "0";
cout << "\n";
}
else
cout << "INCORRECT\n";
}
}
}