猿辅导笔试题目

693 阅读2分钟

这几天笔试太多,被虐的很惨,今天才有空把猿辅导笔试没写出的题目弄会,题目不是很难,也大概知道怎么做,就是写不出代码。

字符串解码:

题目输入:

输入: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;
}