笔试题:字符串解码

278 阅读2分钟

今天做了猿辅导的笔试题,遇到了华为笔试的题目,竟然没有在规定的时间内调出来悔恨万分。主要是小细节太多了,笔试的时候粗心,很多地方都有弱智的错误。笔试完了之后,又调了半个小时才跳出来,实在是太菜了。特把调出来的代码贴上来,谨记教训。

题目描述

字符串解码,具体解码要求看示例:

输入:
3
A11B
(AA)2A
((A2C)3DD)2

其中第一行为需要解码的字符串的行数,下面的行即为要解码的字符串。可能会存在像第三行那样的括号的嵌套。

输出:
AAAAAAAAAAAB
AAAAA
AACAACAACDDAACAACAACDD

我的解法

由于代码是过后才调出来的,没有在系统里提交过,所以不确定对所有输入都能产生正确的结果。目前只测试了题目给的用例,和自己造的几个用例。如果发现bug,可以在评论区留言。

#include "pch.h"
#include <iostream>
#include<vector>
#include<string>
#include<sstream>
#include<list>
#include<stack>
#include<algorithm>
using namespace std;

bool isNum(char c) {
	if (c >= '0' && c <= '9')
		return true;
	else
		return false;
}

//截取数字,返回字符结束后的下一个字符的位置
int getNum(string str, int& i){
	string numStr = "";
	while (1) {
		if (isNum(str[i]))
			numStr += str[i];
		else
			break;
		i++;
	}
	i--;
	int num = stoi(numStr);
	return num;
}

void deal(string str) {
	stack<char> S;
	int length = str.length();
	for (int i = 0; i < length; i++) {
		//第一种情况,直接碰到数字,数字前面没有右括号
		if (isNum(str[i])) {
			int num = getNum(str, i);
			char c = S.top();
			S.pop();
			while (num--) {
				S.push(c);
			}
		}
		//第二种情况,碰到一个括号,后面跟着数字
		else if (str[i] == ')') {
			string s = "";
			char c = S.top();
			while (c != '(') {
				s = s + c;
				S.pop();
				c = S.top();
			}
			S.pop();
			reverse(s.begin(), s.end());
			int num = getNum(str, ++i);
			while (num--) {
				for (auto c : s) {
					S.push(c);
				}
			}
		}
		else {
			S.push(str[i]);
		}
	}
	stack<char> S1;
	while (!S.empty()) {
		char c = S.top();
		S1.push(c);
		S.pop();
	}

	while (!S1.empty()) {
		char c = S1.top();
		cout << c;
		S1.pop();
	}
}

int main() {
	//处理输入
	string line;
	vector<string> input;
	while (getline(cin, line)) {
		istringstream oneLine(line);
		string s;
		oneLine >> s;
		input.push_back(s);
	}
	int n = input[0][0] - '0';
	for (int i = 1; i <= n; i++) {
		string str = input[i];
		//处理每一行的字符
		deal(str);
		cout << endl;
	}
}