字符串处理
介绍一下牛客——华为机试中的字符串内容,特别是一些常用库函数的使用
常用函数总结
字符串转数字
int i = stoi(str);
数字转字符串
string s=to_string(n);
HJ1 字符串最后一个单词的长度
while(cin >> s);,只要有空格就能分隔开每次输入,所以最后一次输入就是最后一个单词
#include<bits/stdc++.h>
using namespace std;
int main() {
string s;
while(cin >> s);
cout << s.size();
return 0;
}
HJ2 计算某字符出现次数
方法1
getline(cin, s);就能将cin输入到s中(cin会被空格影响隔开每次cin,但getline不会)
getchar()的返回值就是那个字符
tolower(ch) 转小写
使用到了count_if函数(count_if和count类似,区别在于第三个参数,count需要对应容器中的类型,而count_if可以是表达式)和lambda表达式
C++11 lambda表达式精讲
C++ lambda表达式与函数对象
#include <algorithm>
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s;
getline(cin, s);
char c = tolower(getchar());
cout << count_if(s.begin(), s.end(), [c](char i) { return towlower(i) == c; }) << endl;
}
unsigned short int 其实等于 uint16_t;
类型的别名浅析C语言之uint8_t / uint16_t / uint32_t /uint64_t
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s;
getline(cin, s);
char c = tolower(getchar());
uint16_t n = 0;
for (auto i : s) {
if (tolower(i) == c) {
++n;
}
}
cout << n << endl;
}
方法 2 map
出现次数理应想到map
#include <iostream>
#include <string>
#include <unordered_map>
using namespace std;
int main(int, char **)
{
string s;
char c;
getline(cin, s) >> c;
unordered_map<char, size_t> unorderedMap;
for (auto i : s) {
++unorderedMap[tolower(i)];
}
cout << unorderedMap[tolower(c)] << endl;
}
HJ4 字符串分隔
方法1 直接字符串操作
str.substr(i, 8) 从第str的第i个开始,截取八个字符出来的字符串
str.append(count, ‘0’); 在字符串后面添加count个’0’字符
#include <iostream>
#include <string>
using namespace std;
int main()
{
string str;
while (cin >> str)
{
// 补0
int len = str.size();
if (len % 8 != 0)
{
int count = 8 - len % 8;
str.append(count, '0');
}
// 按格式输出
int newLen = str.size();
for (int i = 0; i < newLen; i += 8)
{
cout << str.substr(i, 8) << endl;
}
}
return 0;
}
方法2 cout成员函数
利用cout对象的成员函数width()指定输出域宽,
使用成员函数fill()指定填充字符
使用流操纵符left指定左对齐
使str剩余的字符串长度不足8,str.substr(0, 8)也能正常获取剩余的字符,不会报错。
#include <iostream>
#include <string>
using namespace std;
int main()
{
string str;
while (cin >> str)
{
int len = str.size();
for (int i = 0; i < len; i += 8)
{
cout.width(8);
cout.fill('0');
cout << left << str.substr(i, 8) << endl;
}
}
return 0;
}
HJ5 进制转换
方法1 利用ASCII码
字符强转成int类型的时候就会变成对应的ASCII码
空格的ASCII码值为32;
数字0到9的ASCII码值分别为48到57;
大写字母“A”到“Z”的ASCII码值分别为65到90;
小写字母“a”到“z”的ASCII码值分别为97到到122。
#include <iostream>
using namespace std;
int main() {
std::string a;
std::cin >> a;
int b = 0;
int c = 1;
for (int i = a.size() - 1; i >= 2; i--) {
int temp = (int)a[i];
if (temp >= 65) temp = temp - 55;
if (temp >= 48) temp = temp - 48;
b += temp * c;
c = 16 * c;
}
std::cout << b;
}
#include<iostream>
#include<string>
#include<cmath>
using namespace std;
int main()
{
string str;
while (cin >> str)
{
int len = str.size();
int sum = 0;
//十六进制转换为十进制
for (int i = len - 1; i >= 0; --i)
{
// 数字字符的转换,ASCII码:'0'——>48,十六进制:0——>0
if (str[i] >= '0' && str[i] <= '9')
{
sum += (str[i] - 48) * pow(16, len - 1 - i);
}
// 字母字符的转换,ASCII码:A——>65,十六进制:A——>10
else if (str[i] >= 'A' && str[i] <= 'F')
{
sum += (str[i] - 55) * pow(16, len - 1 - i);
}
}
cout << sum << endl;
}
}
方法2 C++自带16进制的输入
#include <iostream>
using namespace std;
int main(int, char**)
{
uint32_t n;
cin >> hex >> n;
cout << n << endl;
}
方法3 stoi函数
#include<iostream>
#include<string>
using namespace std;
int main()
{
string s;
while(getline(cin,s))
{
cout<<stoi(s,0,16)<<endl;//stoi(字符串,起始位置,n进制),将 n 进制的字符串转化为十六进制
//将字符串 s 从 0 位置开始到末尾的 2 进制转换为十六进制.
}
return 0;
}
HJ11 反转字符串
方法1 reverse
#include<bits/stdc++.h>
using namespace std;
int main(){
string str;
cin>>str;
reverse(str.begin(), str.end());
cout<<str;
return 0;
}
方法2
copy(str.rbegin(),str.rend(),ostreambuf_iterator(cout));
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main(){
string str;
getline(cin, str);
copy(str.rbegin(),str.rend(),ostreambuf_iterator<char>(cout));
}
HJ17 坐标移动
比较复杂,重点复习
方法1 C++正则表达式
#include <iostream>
#include <string>
#include <vector>
#include <set>
#include<regex>
using namespace std;
int main(){
string s;
getline(cin,s);
int x=0,y=0;
int j=0;
for(int i=0;i<s.size();++i)
{
if(s[i]==';')
{
string t=s.substr(j,i-j);
regex pattern("^([ASWD]{1})(\\d{1,2})$");
smatch result;
bool flag=regex_match(t,result,pattern);
if(flag)
{
if(result[1]=='A') x-=stoi(result[2]);
else if(result[1]=='D') x+=stoi(result[2]);
else if(result[1]=='S') y-=stoi(result[2]);
else if(result[1]=='W') y+=stoi(result[2]);
}
while(i<s.size()&&s[i+1]==';') ++i;
j=i+1;
}
}
cout<<x<<','<<y<<endl;
}