1.给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。
分析:
代码:
int main()
{
string s="";
char c=cin.get();
while(c!=‘\n‘){
if(c==‘\‘‘||c==‘,‘||c==‘.‘||c==‘ ‘){
s=s;
}else{
s+=c;
}
c=cin.get();
}
int n=s.size();
int Pos_start[26];
int num_char[26];
for(int i=0;i<26;i++){
Pos_start[i]=-1;
num_char[i]=0;
}
for(int i=0;i<n;i++){
int tmp=s[i]-‘a‘;
num_char[tmp]++;
if(Pos_start[tmp]==-1){
Pos_start[tmp]=i;
}
}
int index=n;
for(int i=0;i<26;i++){
if(num_char[i]==1){
if(Pos_start[i]<index){
index=Pos_start[i];
}
}
}
cout<<index<<endl;
return 0;
}
2.最长可整合子数组的长度
题目描述
输入描述:
第一行一个整数N,表示数组长度
第二行N个整数,分别表示数组内的元素
输出描述:
输出一个整数,表示最大可整合子数组的长度
分析:
代码:
#include <iostream> #include<set> using namespace std; int main() { int N; cin>>N; set<int> A; int a; for(int i=0;i<N;i++){ cin>>a; A.insert(a); } int len=A.size(); if(len<=1){ cout<<len<<endl; return 0; } int dp[len]; dp[0]=1; int res=1; set<int>::iterator it=A.begin(); it++; int i=1; for(;it!=A.end();it++,i++){ if(*(it--)-*it==1){ dp[i]=dp[i-1]+1; if(dp[i]>res){ res=dp[i]; } }else{ dp[i]=1; } it++; } cout<<res<<endl; return 0; }
3.不重复打印排序数组中相加和为给定值的所有二元组
题目描述
输入描述:
第一行有两个整数n, k
接下来一行有n个整数表示数组内的元素
输出描述:
输出若干行,每行两个整数表示答案
按二元组从小到大的顺序输出(二元组大小比较方式为每个依次比较二元组内每个数)
分析:
代码:
#include <iostream> #include<vector> using namespace std; int main() { int n,k; cin>>n>>k; vector<int> A(n); for(int i=0;i<n;i++){ cin>>A[i]; } int low=0; int high=n-1; while(low<high){ if(A[low]+A[high]==k){ cout<<A[low]<<" "<<A[high]<<endl; while(low+1<n&&A[low]==A[low+1])low++; while(high-1>=0&&A[high]==A[high-1])high--; low++; high--; }else if(A[low]+A[high]>k){ high--; }else{ low++; } } return 0; }
4、设计getMin功能的栈
题目描述
输入描述:
第一行输入一个整数N,表示对栈进行的操作总数。
下面N行每行输入一个字符串S,表示操作的种类。
如果S为"push",则后面还有一个整数X表示向栈里压入整数X。
如果S为"pop",则表示弹出栈顶操作。
如果S为"getMin",则表示询问当前栈中的最小元素是多少。
输入
6 push 3 push 2 push 1 getMin pop getMin
1 2
代码:
#include <iostream> #include<stack> using namespace std; class SStack{ public: stack<int> main_stack; stack<int> min_stack; public: void push(int a){ main_stack.push(a); if(min_stack.empty()||min_stack.top()>=a){ min_stack.push(a); } } void pop(){ if(main_stack.top()==min_stack.top()){ min_stack.pop(); } main_stack.pop(); } int getMin(){ if(!min_stack.empty()) return min_stack.top(); else{ return -1; } } }; int main() { SStack ss; int n; cin>>n; string op; int a; for(int i=0;i<n;i++){ cin>>op; if(op=="push"){ cin>>a; ss.push(a); }else if(op=="pop"){ ss.pop(); }else if(op=="getMin"){ cout<<ss.getMin()<<endl; } } return 0; }
5、由两个栈组成队列
题目描述
输入描述:
第一行输入一个整数N,表示对队列进行的操作总数。
下面N行每行输入一个字符串S,表示操作的种类。
如果S为"add",则后面还有一个整数X表示向队列尾部加入整数X。
如果S为"poll",则表示弹出队列头部操作。
如果S为"peek",则表示询问当前队列中头部元素是多少。
输出描述:
对于每一个为"peek"的操作,输出一行表示当前队列中头部元素是多少。
输入
6 add 1 add 2 add 3 peek poll peek
输出
1 2
分析:
代码:
#include <iostream> #include<stack> using namespace std; class QQue{ public: stack<int> s1; stack<int> s2; public: void add(int a){ s1.push(a); } void poll(){ if(s2.empty()){ while(!s1.empty()){ s2.push(s1.top()); s1.pop(); } } s2.pop(); } int peek(){ if(s2.empty()){ while(!s1.empty()){ s2.push(s1.top()); s1.pop(); } } if(s2.empty()){ return -1; } return s2.top(); } }; int main() { int n; cin>>n; QQue qq; string s; int a; for(int i=0;i<n;i++){ cin>>s; if(s=="add"){ cin>>a; qq.add(a); }else if(s=="poll"){ qq.poll(); }else if(s=="peek"){ cout<<qq.peek()<<endl; } } return 0; }
6、用递归函数和栈逆序一个栈
题目描述
一个栈依次压入1,2,3,4,5,那么从栈顶到栈底分别为5,4,3,2,1。将这个栈转置后,从栈顶到栈底为1,2,3,4,5,也就是实现栈中元素的逆序,但是只能用递归函数来实现,不能用其他数据结构。
输入描述:
输入数据第一行一个整数N为栈中元素的个数。
接下来一行N个整数X_iXi?表示从栈顶依次到栈底的每个元素。
输出描述:
输出一行表示栈中元素逆序后的每个元素
示例1
输入
5
1 2 3 4 5
输出
5 4 3 2 1
分析:
代码:
#include <iostream> #include<stack> using namespace std; void f(stack<int> s){ if(s.empty()) return; else{ int a=s.top(); s.pop(); f(s); cout<<a<<" "; } } int main() { int n; cin>>n; stack<int> s; int A[n]; for(int i=0;i<n;i++){ cin>>A[i]; } for(int i=n-1;i>=0;i--){ s.push(A[i]); } f(s); cout<<endl; return 0; }
原文:https://www.cnblogs.com/mochensun/p/11896533.html