HJ74参数解析

一.题目描述

输出一个个字符串表示一个命令行,在这个命令行中有不同的参数,求参数的个数并且解析出参数。

解析规则:

1.参数分隔符为空格

2.对于用" "包含起来的参数,如果中间有空格,不能解析为多个参数。

3.参数不定长

4.输入由用例保证,不会出现不符合要求的输入

基于解析规则我们可以知道如下两点:

1.空格是参数之间是利用空格进行分割的
2." "中间的也是参数,并且" "中的空格并不分割的,是参数的一部分

alt

二.算法一(模拟)

由于主要区分点在于空格和引号,所以我们只需要区分引号和空格并且做好对每一个参数的记录,下面是完整代码和注释:

alt

#include<bits/stdc++.h>
using namespace std;
int main(){
    string s;
    vector<string>q;
    string str="";//用来记录每一个参数
    bool ck=true;
    while(getline(cin,s)){//一行进行读入
        str="";
        for(int i=0;i<s.size();i++){
            if(!ck){
                //ck=false表示目前是在" "中记录参数
                if(s[i]!='"'){
                    str+=s[i];
                } else {
                    ck=true;
                    q.push_back(str);
                    str="";
                }
                continue;
            } 
            //对空格分隔的参数进行处理
            if(s[i]!=' '&&s[i]!='"'){
                str+=s[i];
            } else {
                if(s[i]=='"'){
                    ck=false;
                    continue;
                }
                if(str!="")
                q.push_back(str);
                str="";
            }
        }
    }
    //最后一个参数需要记录
    if(str!=""){
        q.push_back(str);
    }
    //输出
    cout<<q.size()<<endl;
    for(int i=0;i<q.size();i++){
        cout<<q[i]<<endl;
    }
}

时间复杂度:O(n)O(n),只需要对输入的字符串进行一次遍历。

空间复杂度:O(n)O(n),需要空间去存储参数。

三.算法二(模拟)

可以减少空间的利用率,先对字符串进行遍历统计空格和引号的个数,进而分析出参数个数,然后思路和算法一一样的,直接输出每一个参数不需要对其进行存储,下面是完整代码:

#include<bits/stdc++.h>
using namespace std;
int main(){
    string s;
    vector<string>q;
    string str="";//用来记录每一个参数
    bool ck=true;
    while(getline(cin,s)){//一行进行读入
        int cnt=0;
        for(int i=0;i<s.size();i++){
            if(s[i]=='"'){//进入了引号
                i++;
                while(s[i]!='"'){
                    i++;
                }
            } else if(s[i]==' '){//是个空格就可以说明前面是一个参数
                cnt++;
            }
        }
        //最后一个参数的个数需要加一
        cout<<cnt+1<<endl;
        str="";
        for(int i=0;i<s.size();i++){
            if(!ck){
                //ck=false表示目前是在" "中记录参数
                if(s[i]!='"'){
                    str+=s[i];
                } else {
                    ck=true;
                    //直接输出参数
                    for(int k=0;k<str.size();k++){
                        cout<<str[k];
                    }
                    cout<<endl;
                    str="";
                }
                continue;
            } 
            //对空格分隔的参数进行处理
            if(s[i]!=' '&&s[i]!='"'){
                str+=s[i];
            } else {
                if(s[i]=='"'){
                    ck=false;
                    continue;
                }
                if(str!=""){
                    //直接输出参数
                    for(int k=0;k<str.size();k++){
                        cout<<str[k];
                    }
                    cout<<endl;
                    str="";
                }
                
            }
        }
    }
    //最后一个参数需要输出
    if(str!=""){
        for(int k=0;k<str.size();k++){
             cout<<str[k];
        }
        cout<<endl;
    }
}

时间复杂度:O(n)O(n),只需要对输入的字符串进行两次遍历。

空间复杂度:O(1)O(1),不需要额外空间,直接进行输出。