第一道:字符串处理
对于
(+ 8 3 2)
(* 8 ( - 5 4) 3)
计算其输出结果
#include <map>
#include <cmath>
#include <queue>
#include <cstdio>
#include <string>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <time.h>
#include <vector>
#include <list>
#include "pch.h"
using namespace std;
int find_res(string s) {
int l = s.find('(');
if (l == -1) //没有空格
{
stringstream ss;
ss.str(s);
int op;
vector<int>nums;
char oper;
ss >> oper;
int res = 0;
if (oper == '+') {
while (ss >> op) {
res += op;
}
}
else if (oper == '-')
{
ss >> res;
while (ss >> op) {
res -= op;
}
}
else {
res = 1;
while (ss >> op) {
res *= op;
}
}
return res;
}
else {
char oper;
int i = 0;
for (; i < s.size(); ++i) {
if (s[i] != ' ') {
oper = s[i];
break;
}
}
cout << "oper = " << oper << endl;
stack<int>kuo;
vector<int>room;
int left = i + 1;
for (; i < s.size(); ++i) {
if (s[i] == '(') {
if (kuo.size() == 0) {
stringstream ss;
string mid = s.substr(left, i - left);
cout << "mid = " << mid << endl;
ss.str(mid);
int op;
while (ss >> op) {
room.push_back(op);
}
}
kuo.push(i);
}
else if (s[i] == ')') {
if (kuo.size() == 1) {
left = kuo.top();
kuo.pop();
string mid = s.substr(left + 1, i - left - 1);
left = i + 1;
cout << mid << endl;
room.push_back(find_res(mid));
}
else
kuo.pop();
}
}
if (left < s.size()) {
stringstream ss;
string mid = s.substr(left, s.size() - left);
cout << "mid = " << mid << endl;
ss.str(mid);
int op;
while (ss >> op) {
room.push_back(op);
}
}
int res = 0;
for (auto num : room) {
cout << num << ' ';
}
cout << endl;
if (oper == '+') {
for (auto num : room) {
res += num;
}
}
else if (oper == '-')
{
res = room[0];
for (int j = 1; j < room.size(); ++j) {
res -= room[j];
}
}
else {
res = room[0];
for (int j = 1; j < room.size(); ++j) {
res *= room[j];
}
}
cout << "agag" << endl;
return res;
}
}
int main()
{
string S;
while (getline(cin, S)) {
cout << S << endl;
int l = S.find('('), r;
for (int i = S.size() - 1; i > l; --i) {
if (S[i] == ')') {
r = i;
break;
}
}
cout << l << ' ' << r << endl;
string mid = S.substr(l + 1, r - l - 1);
cout << mid << endl;
int res = find_res(mid);
cout << "res = " << res;
}
return 0;
}
第二道:最大最小利连续子数组和(二分)
对于一数组[1,2,3,4,5,6,7,8,9],分成连续的n份,找到其最小子数组和的最大值
#include <map>
#include <cmath>
#include <queue>
#include <cstdio>
#include <string>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <time.h>
#include <vector>
#include <list>
#include <deque>
#include <unordered_map>
#include <unordered_set>
using namespace std;
bool check(vector < int > packets, int n, int value) {
int Sum = 0, count = 0;
for (int i = 0; i < packets.size(); ++i) {
Sum += packets[i];
if (Sum >= value) {
Sum = 0;
count++;
}
}
return count >= n;
}
int maxAmount(vector < int > packets, int n) {
int Sum = 0;
for (int i = 0; i < packets.size(); ++i) {
Sum += packets[i];
}
int l = 0, r = Sum / 6 + 1;
cout << l << ' ' << r << endl;
while (l <= r) {
int mid = (l + r) >> 1;
cout << mid << endl;
if (check(packets, n, mid)) {
l = mid + 1;
}
else
r = mid - 1;
}
return l - 1;
}
int main()
{
int N, val;
cin >> N;
vector<int>room(N);
for(int i=0;i<N;++i){
cin >> room[i];
}
int mid;
cin >>mid;
cout << maxAmount(room,mid);
return 0;
}
字符串压缩和解压缩:
对于001010:110110:000110:000000,其压缩后为1010:10110:110: 设计算法实现其压缩和解压缩。
#include <map>
#include <cmath>
#include <queue>
#include <stack>
#include <cstdio>
#include <string>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <time.h>
#include <vector>
#include <list>
#include <deque>
using namespace std;
vector<string> split(const string &str, const char pattern)
{
vector<string> res;
stringstream input(str); //读取str到字符串流中
string temp;
while (getline(input, temp, pattern))
{
res.push_back(temp);
}
return res;
}
string yasuo(string s) {
vector<string>load;
string res;
load = split(s, ':');
for (int i = 0; i < load.size();++i) {
int index = load[i].find('1');
cout << index << ' ' << ' ' << endl;
if(index != -1)
res+= load[i].substr(index, load[i].size() - index + 1);
if (i != load.size() - 1)
res += ":";
}
return res;
}
string jieya(string s) {
string res;
s += ":";
cout << s << endl;
int l = 0, r = 0;
r = s.find(':');
while (r != -1) {
string mid = s.substr(l, r - l);
cout << mid << endl;
int N = 6 - mid.length();
for (int i = 0; i < N; ++i) {
res += "0";
}
res += mid + ":";
s = s.substr(r + 1, s.size() - l + 1);
cout << s << endl;
l = 0;
r = s.find(':');
}
return res.substr(0, res.size() - 2);
}
int main()
{
string S;
int flag;
cin >> flag >> S;
if (flag == 0) {
cout << yasuo(S) << endl;;
}
else {
cout << jieya(S) << endl;
}
int N;
cin >> N;
return 0;
}