题目
今天是用Ubuntu写的Blog,这个系统是我用来做AOSP P适配用的,顺手装了个CLion写题,懒得装截图软件,就这样将就着用用吧。
原题链接
题意
本题是一道模拟题,模拟类Linux终端中命令行参数读取功能。在两个
"
之间或是两个(空格)之间的就是命令行参数。我们的任务就是从输入流中提取出参数并用一对
<>
包起来换行输出。
代码
- 解法一
#include <bits/stdc++.h>
using namespace std;
int main() {
vector<char> str;
char temp;
do{
temp=getchar();
str.push_back(temp);
}
while (temp!='\n');
int i,flag=0,flag2=0,flag3=0;
for (i=0;i<str.size();i++)
{
if ((flag%2&&flag3%2==0||flag3%2&&flag%2==0)&&!flag2)
{
putchar('<');
flag2=1;
}
else if ((flag3%2==0&&flag%2==0)&&flag2)
{
flag2=0;
cout<<'>'<<endl;
}
if (str[i]=='"')
{
flag++;
}
else if (isspace(str[i])&&!isspace(str[i+1])&&(!(flag3%2))&&flag%2==0&&str[i+1]!='"')
{
flag3++;
}
else if (!isspace(str[i-1])&&isspace(str[i])&&(flag3%2)&&flag%2==0&&str[i-1]!='"')
{
flag3++;
if (!isspace(str[i+1])&&str[i+1]!='"')
{
cout<<'>'<<endl;
flag2=0;
flag3++;
}
}
else if(flag%2||flag3%2)
{
putchar(str[i]);
}
else if (!isspace(str[i])&&str[i]!='"'&&i==0)
{
putchar('<');
flag2=1;
cout<<str[i];
flag3++;
}
else if (!isspace(str[i])&&str[i]!='"'&&str[i+1]=='\n')
{
flag2=0;
cout<<'>'<<endl;
}
}
return 0;
}
- 解法二
还有一种用vector做的方法,思路是先将所有的输入存起来,再判断开头是什么,如果是字母就带上
<
输出,不是就先输出<
,再将这个erase掉,如果下一个还不是有效字符如"或非空格字符前的空格
,就一直erase,直到遇上有效字符,就输出。到倒数第二个字符后,由于最后一个字符我设定是\n
,所以直接cout<<THAT_CHAR<<endl
即可。
这个思路因为我已经做出了第一个方法,而且觉得并没有在复杂度上太占优势,只是比较简单,所以没有写成代码,不过能想到另一条路也还是蛮好的。
思路
解法一的思路是分三种情况讨论,
"
型和型或是
A
/A
型,第三种我是在第二种的基础上改进的,主要是判断第一个是空格还是有效字符来判断类型,第一种类型判断比较简单,第二种要注意夹在两个命令行变量之间的空格是需要复用的。然后在整体上要注意三种类型的耦合,一步想错整体输出就会出错,这个方法比较复杂,在这种思路明确且考虑情况比较少的情况下可以使用,但是在情况复杂多变的时候就不行了,代码的耦合度最好低一些,无论是不是做大型项目。
总结
本题2000分,第一次在Linux环境下写题,虽然是较为简单的模拟、字符串题,我比较擅长模拟和字符、字符串类型的题目,所以下个阶段我的重心要转移到做没怎么做过的DP题上。
在编程软件方面,Xcode是当之无愧的最好用的编译器(在我个人看来),CLion虽然也有自己的特色,也还算好用,但是我还是更喜欢我MBP上的Xcode。至于Codelocks,它除了开源免费外一无是处,叫做BugBlocks我觉得更合适(手动滑稽),但是比赛要用也没办法,咬着牙用喽(Dev-C++的调试功能真的窒息,也不好用)。
PS:最近想搞搞Android P适配教程来练习一下自己的MarkDown,虽然我在Github上的项目还是比不上Github上的高产大佬们,但是我还是想试着整理一下这从Android N到P的适配历程,嘿嘿。