华为机试:数字字符串组合倒序

题目描述

在这里插入图片描述

题目解析

思路:

  • 先将字符串的整理好,比如I am an 20-years out--standing @ * -stu- dent变为I am an 20-years out standing stu dent
    • 先判断它是不是整数、字符,如果是,表示是一个有效字符,直接追加
    • 如果遇到-,那么判断它上一个以及下一个是不是整数、字符,如果是,那么表示它是一个连续字符
    • 其他情况,用 代替
  • 然后用 切割好
  • 最后反转
#include<bits/stdc++.h>

using namespace std;

bool isValid(char ch){
    return isalpha(ch) || isdigit(ch);
}

std::vector<std::string> split(std::string str){
    std::vector<std::string> ans;
    str += ' ';
    int  i = 0, s = 0;
    // 先跳过开头所有的' '
    while (i < str.size() && str[i] == ' '){
        i++;
    }
    s = i; // j是下一个有效字符的起始
    while (i < str.size()){
        if(str[i] == ' '){
            std::string tmp = str.substr(s, i - s);
            ans.push_back(tmp);
            // 跳过接下来的所有' '
            while (i < str.size() && str[i] == ' '){
                i++;
            }
            s = i;
        }else{
            i++;
        }
    }
    return ans;
}

std::string process(std::string str){
    std::string tmp;
    for (int i = 0; i < str.size(); ++i) {
        if(isValid(str[i])){
            tmp.push_back(str[i]);
        }else if(str[i] == '-' && isValid(str[i - 1]) && isValid(str[i + 1])){  // -一定会有上一个或者下一个的
            tmp.push_back('-'); // 说明是规则1
        }else{
            tmp.push_back(' ');
        }
    }

    auto vec = split(tmp);
    tmp.clear();
    std::reverse(vec.begin(), vec.end());
    for (const auto & i : vec) {
        tmp +=  i + " ";
    }
    if(!tmp.empty()){
        tmp.pop_back();
    }
    return tmp;
}
int main(int argc, char **argv)
{
    std::cout << process("I am an 20-years out--standing @ * -stu- dent");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值