题目:合理的栈顺序
cpp描述 给定一串字符,每个字符都需要进一个字符栈,它们的进栈顺序即它们在字符串中的顺序,再给出一种可能的出栈顺序字符串,请你编写一个程序检查出栈顺序是否合理,如果不合理请输出"error",如果合理,请输出"right"。 输入描述 输入两行字符串,每行字符串长度不超过 255。 输出描述 输出压缩之后的字符串形式。 用例输入 1 aabc abac 用例输出 1 right代码:
cpp#include <bits/stdc++.h> using namespace std; int j; string a,b; int main(){ cin>>a>>b; stack<char> s; for(int i=0;i<a.size();i++){ s.push(a[i]); while(s.size() && s.top()==b[j]){ j++; s.pop(); } } if(s.size()){ cout<<"error"<<endl; }else{ cout<<"right"<<endl; } return 0; }
题目:括号匹配
cpp描述 输入描述 一个字符串,只包含左括号和右括号,长度小于等于10 5 。 输出描述 合法的输出YES,不合法的输出NO 用例输入 1 (()(())) 用例输出 1 YES代码:
cpp#include<bits/stdc++.h> using namespace std; int j,flat; string a; int main(){ cin>>a; stack<char> s; for(int i=0;i<a.size();i++){ if(a[i]=='('){ s.push(a[i]); }else if(s.size() && a[i]==')' && s.top()=='('){ s.pop(); }else if(s.size()==0 && a[i]==')'){ cout<<"NO"<<endl; return 0; } } if(s.size()){ cout<<"NO"<<endl; }else{ cout<<"YES"<<endl; } return 0; }
题目:约瑟夫环
cpp描述 n 个人围成一圈,从第一个人开始报数,数到 m 的人出列,再由下一个人重新从 1 开始报数,数到 m 的人再出圈,依次类推,直到所有的人都出圈,请输出依次出圈人的编号。 输入描述 输入两个整数 n,m。 输出描述 输出一行 n 个整数,按顺序输出每个出圈人的编号。 用例输入 1 5 2 用例输出 1 2 4 1 5 3代码:
cpp#include<bits/stdc++.h> using namespace std; int n,m,sum,j; int main(){ cin>>n>>m; queue<int> s; for(int i=1;i<=n;i++){ s.push(i); } for(int i=1;i<=n*m;i++){ sum++; if(s.size() && sum==m){ cout<<s.front()<<' '; s.pop(); sum=0; }else{ j=s.front(); s.pop(); s.push(j); } } return 0; }
题目:数组去重
cpp描述 给定一个由n个数组成的数组,请你从小到大输出该数组去重后的元素。 输入描述 一个正整数n,代表数的个数,n<=10 5 输出描述 一行若干数,代表该数组从小到大排序后的元素。 用例输入 1 6 1 3 3 4 2 2 用例输出 1 1 2 3 4代码:
cpp#include<bits/stdc++.h> using namespace std; const int N =1e5+10; int n,a[N]; int main(){ cin>>n; set<int> s; for(int i=1;i<=n;i++){ cin>>a[i]; } for(int i=1;i<=n;i++){ s.insert(a[i]); } for(auto x:s){ cout<<x<<' '; } return 0; }
题目:[GESP202503 三级] 词频统计
cpp出题人: 描述 在文本处理中,统计单词出现的频率是一个常见的任务。现在,给定 n 个单词,你需要找出其中出现次数最多的单词。在本题中,忽略单词中字母的大小写(即 Apple、apple、APPLE、aPPle 等均视为同一个单词)。 请你编写一个程序,输入 n 个单词,输出其中出现次数最多的单词。 输入描述 第一行,一个整数 n,表示单词的个数; 接下来 n 行,每行包含一个单词,单词由大小写英文字母组成。 输入保证,出现次数最多的单词只会有一个。 输出描述 输出一行,包含出现次数最多的单词(输出单词为小写形式)。 用例输入 1 6 Apple banana apple Orange banana apple 用例输出 1 apple 提示 对于所有测试点,1≤n≤100,每个单词的长度不超过 30,且仅由大小写字母组成。代码:
cpp#include<bits/stdc++.h> using namespace std; int n,sum; string ans; int main() { cin>>n; map<string,int> a; for(int i=1;i<=n;i++){ string s; cin>>s; for(int j=0;j<s.size();j++){ if(s[j]>='A' && s[j]<='Z'){ s[j]+=32; } a[s]++; if(a[s]>sum)sum=a[s],ans=s; } } cout<<ans<<endl; return 0; }
题目:向左看齐
cpp描述 给定一个长度为n的数组a 1,a[2],....,a[n],输出每个位置i上,左边最近的小于a[i]的位置,如果不存在则输出0。 如n=4时 a = {4,7,6,10} 应该按顺序输出0 1 1 3 解释: i=1时,4左边没有比它小的,输出0 i=2时,7左侧最近比它小的,在下标为1的位置 i=3时,6左侧最近比它小的,在下标为1的位置 i=4时,10左侧最近比它小的,在下标为3的位置 输入描述 第一行一个整数n,代表元素个数,n<=1e5 第二行n个数,代表每个a[i],空格隔开, a[i]<=1e9 输出描述 n个数l[1],l[2],...l[n],每个l[i]代表在原数组第i个位置上,左侧最近的小于a[i]的位置。 用例输入 1 4 4 7 6 10 用例输出 1 0 1 1 3代码(单调栈算法):
cpp#include<bits/stdc++.h> using namespace std; int n,a[100005]; int main(){ cin>>n; a[0]=0; stack<int> s; for(int i=1;i<=n;i++){ cin>>a[i]; while(s.size() && a[s.top()]>=a[i]){ s.pop(); } if(s.size())cout<<s.top()<<' '; else cout<<0<<' '; s.push(i); } return 0; }