这几天笔试太多,被虐的很惨,今天才有空把猿辅导笔试没写出的题目弄会,题目不是很难,也大概知道怎么做,就是写不出代码。
字符串解码:
题目输入:
输入:3A11B(AA)2A((A2C)3DD)2
解码后输出:
AAAAAAAAAAABAAAAAAACAACAACDDAACAACAACDD
代码:
我自己写的时候,觉得很乱,考虑了这个又考虑那个的感觉。导致我的思路一致很乱,结果没有写出来,看了同学的代码之后觉得自己思路没错,但就是变不成代码,可能还是自己代码写少了,应该还得多加练习,学会把复杂问题简单化,拆成一步一步实现。
#include<iostream>
#include<vector>
#include<string>
#include<sstream>
#include<stack>
using namespace std;
//学会把频繁使用功能弄成函数,这样代码会简洁很多,思路也会更清晰
bool isNum(char c)
{
if (c <= '9'&&c >= '0')
return true;
else
return false;
}
int getNum(string str, int i)
{
string numStr = "";
while (1)
{
if (str[i] >= '0'&&str[i] <= '9')
numStr += str[i];
else
break;
i++;
}
i--;
int num = stoi(numStr);
return num;
}
void deal(string str)
{
int num;
stack<char> s;
for (int i = 0; i < str.length(); i++)
{
//没有括号的情况,直接遇到数字
if (isNum(str[i]))
{
num = getNum(str, i);
char tmp = s.top();
s.pop();
while (num--)
{
s.push(tmp);
}
}
//遇到括号,后面跟数字 这里面是检查后面的括号,我自己做的时候检查前面的括号,然后找后面的。结果越弄越乱
else if(str[i] == ')')
{
string tmp = "";
char c = s.top();
s.pop();
while (c!='(')
{
tmp += c;
c = s.top();
s.pop();
}
int num = getNum(str, ++i);
reverse(tmp.begin(), tmp.end());
while (num--)
{
for (auto t : tmp)
{
s.push(t);
}
}
}
else
{
s.push(str[i]);
}
}
stack<char> S1;
while (!s.empty())
{
S1.push(s.top());
s.pop();
}
while (!S1.empty())
{
cout << S1.top();
S1.pop();
}
cout << endl;
}
int main()
{
int n;
cin >> n;
vector<string> input;
string s;
while (n--)
{
cin >> s;
input.push_back(s);
}
for (int i = 0; i < input.size(); i++)
{
deal(input[i]);
}//这里我是直接把整个vector数组传进去,导致在调用函数里面多加了一层循环,这个是个很好的方式
return 0;
}