题目链接: 831. 隐藏个人信息 - 力扣(Leetcode)
题目描述: 太长了,点链接看吧还是(
看到这道题的第一反应是不难,没有涉及到复杂的算法,基本只是考察码代码的能力,先贴上我写的代码
class Solution {
private:
bool isdigit(char c){
return c>='0'&&c<='9';
}
bool findAt(string &s){
for(auto it=s.begin();it!=s.end();it++){
if(*it=='@') return true;
}
return false;
}
string maskPhoneNumber(string& s){
int nums=0;
string res;
for(auto it=s.begin();it!=s.end();it++){
if(isdigit(*it)){
nums++;
}
}
if(nums!=10){
res.push_back('+');
for(int i=0;i<nums-10;i++){
res.push_back('*');
}
res.push_back('-');
}
res+="***-***-";
for(int i=0;i<s.length();i++){
if(isdigit(s.at(i))){
if(nums<=4){
res.push_back(s.at(i));
}
else{
nums--;
}
}
}
return res;
}
string maskEmail(string& s){
transform(s.begin(),s.end(),s.begin(),::tolower);
string res;
res.push_back(s.at(0));
res+="*****";
int i=1;
for(;i<s.length();i++){
if(s.at(i+1)=='@'){
res.push_back(s.at(i));
break;
}
}
res+=s.substr(i+1,s.length()-1);
return res;
}
public:
string maskPII(string s) {
string res;
if(!findAt(s)){
return maskPhoneNumber(s);
}
else{
return maskEmail(s);
}
return {};
}
};
重写了isdigit
函数和find
函数,是因为对C++尤其是STL的掌握还不熟悉,所以自己写了一个更便于理解的函数。一共提交了三次,第一次是越界问题,说明对string类的掌握还不太好,第二次是解答错误,后来定位问题是判断字符是邮箱还是电话号码时出错。总之从此题看的出来,对基础语法,语法结构,模板库的使用有很大欠缺。
然后在贴一个官方的题解
class Solution {
public:
vector<string> country = {"", "+*-", "+**-", "+***-"};
string maskPII(string s) {
string res;
int at = s.find("@");
if (at != string::npos) {
transform(s.begin(), s.end(), s.begin(), ::tolower);
return s.substr(0, 1) + "*****" + s.substr(at - 1);
}
s = regex_replace(s, regex("[^0-9]"), "");
return country[s.size() - 10] + "***-***-" + s.substr(s.size() - 4);
}
};
作者:力扣官方题解
链接:https://leetcode.cn/problems/masking-personal-information/solutions/2200759/yin-cang-ge-ren-xin-xi-by-leetcode-solut-2enf/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
很喜欢评论区的一段话: 看了题解感觉自己可以去麦当劳看大门了T_T