【华为机试】字符串处理

介绍一下牛客——华为机试中的字符串内容,特别是一些常用库函数的使用

常用函数总结

字符串转数字
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;
}

猜你喜欢

转载自blog.csdn.net/m0_51371693/article/details/130077327