1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| class Solution { public: string maskPII(string s) { string result; int at = s.find('@'); if(at != string::npos) { transform(s.begin(), s.end(), s.begin(), ::tolower); result = s.substr(0,1) + "*****"+s.substr(at - 1); } else { vector<string> country = {"", "+*-", "+**-", "+***-"}; s = regex_replace(s, regex("[^0-9]"), ""); result = country[s.size() - 10] + "***-***-" + s.substr(s.size() - 4); } return result; } };
|
简简单单的代码,包含了不少知识:
string::npos的类型
网上一些博客有这样一种说法,string::npos不应该被定义为int,这样会导致错误,经过查阅,这种说法既对又不对。
在一些老版本的C++标准中,string::npos可能被定义为一个int类型的常量,这可能会导致一些类型转换问题。但在C++11及以上的标准中,string::npos被定义为size_t类型的常量,因此不会出现类型问题。
用双引号和单引号表示的字符串有什么区别?
在C++中,使用双引号 " 表示的字符串是字符串字面量,会被解释为一个
const char* 类型的指针。例如,const char* s = "hello";
将会创建一个指向字符串 "hello" 的指针。
而使用单引号 ' 表示的是字符字面量,会被解释为一个 char
类型的值。例如,char c = 'a'; 将会创建一个值为 'a' 的 char 变量。
另外,双引号表示的字符串可以包含任意数量的字符,而单引号只能包含一个字符。因此,如果要表示一个字符串,应该使用双引号,而如果要表示一个单独的字符,应该使用单引号。
substr
函数在一个参数的时候代表什么?
当 substr
函数只有一个参数时,它表示从该参数所指定的位置开始,一直截取到字符串的末尾。例如,std::string
s = "hello world"; s = s.substr(6); 将把 s 的值改为 "world"。
如何将大写字母转换为小写字母?
可以使用C++中的 std::tolower()
函数将大写字母转换为小写字母。例如,char c = 'A'; c = std::tolower(c);
将把 c 的值改为小写字母 a。
std::transform是C++标准库中的一个算法,它用于对一个序列中的每个元素进行转换,并将结果存储到另一个序列中。transform的一般用法如下:
1
| std::transform(InputIt first1, InputIt last1, OutputIt d_first, UnaryOperation unary_op);
|
其中,first1和last1表示输入序列的范围,d_first表示输出序列的起始位置,unary_op表示对每个输入元素要执行的操作。具体来说,transform将从first1到last1中的每个元素应用unary_op操作,并将结果存储到从d_first开始的输出序列中。
下面是一些transform的常见用法:
- 对容器中的元素应用函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| #include <algorithm> #include <vector> #include <iostream>
int add_one(int x) { return x + 1; }
int main() { std::vector<int> nums{1, 2, 3, 4, 5}; std::vector<int> result(nums.size()); std::transform(nums.begin(), nums.end(), result.begin(), add_one); for (auto i : result) { std::cout << i << " "; } return 0; }
|
上述代码中,transform函数对nums中的每个元素应用add_one函数,并将结果存储到result容器中。
- 对字符串中的字符应用函数
1 2 3 4 5 6 7 8 9 10 11 12
| #include <algorithm> #include <string> #include <cctype> #include <iostream>
int main() { std::string s = "Hello World"; std::transform(s.begin(), s.end(), s.begin(), ::tolower); std::cout << s << std::endl; return 0; }
|
- 对两个容器的元素应用函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| #include <algorithm> #include <vector> #include <iostream>
int add(int x, int y) { return x + y; }
int main() { std::vector<int> nums1{1, 2, 3, 4, 5}; std::vector<int> nums2{6, 7, 8, 9, 10}; std::vector<int> result(nums1.size()); std::transform(nums1.begin(), nums1.end(), nums2.begin(), result.begin(), add); for (auto i : result) { std::cout << i << " "; } return 0; }
|
什么是 regex_replace 函数?
regex_replace 函数是 C++
标准库中正则表达式库的一部分,提供了对字符串进行正则表达式匹配和替换的功能。使用该函数可以将字符串中匹配到的部分替换为指定的内容。