今天做了猿辅导的笔试题,遇到了华为笔试的题目,竟然没有在规定的时间内调出来悔恨万分。主要是小细节太多了,笔试的时候粗心,很多地方都有弱智的错误。笔试完了之后,又调了半个小时才跳出来,实在是太菜了。特把调出来的代码贴上来,谨记教训。
题目描述
字符串解码,具体解码要求看示例:
输入:
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;
}
}