数据结构练习题及参考代码
01画一棵圣诞树(输入输出)
问题描述
用字符s
画出一个n
行的圣诞树
输入描述
输入一个字符s
与一个正整数n
输出描述
输出一个由字符s
构成的n
行的圣诞树
输入样例
+ 5
输出样例
+
++
+++
++++
+++++
参考代码
#include<iostream>
using namespace std;
int main(){
char s;
int n;
cin>>s>>n;
for (int i=1;i<=n;i++){
for (int j=0;j<i;j++){
cout<<s;
}
cout<<endl;
}
return 0;
}
02杨辉三角(vector)
问题描述
给定一个正整数n
,输出杨辉三角的第n
行
输入描述
一个正整数n
输出描述
以一个空格为间隔输出杨辉三角的第n
行所有数
输入样例
3
输出样例
1 2 1
参考代码
#include<iostream>
#include<vector>
using namespace std;
int main(){
int n;
vector<int> res = {1, 1};
cin>>n;
if (n==1){
cout<<1;
return 0;
}
for (int i=2;i<n;i++){
vector<int> temp; // 记录上一层元素
temp = res;
res.clear();
res.push_back(1);
for (int j=0;j<temp.size()-1;j++){
res.push_back(temp[j]+temp[j+1]);
}
res.push_back(1);
}
for (int i=0;i<res.size()-1;i++){
cout<<res[i]<<' ';
}
cout<< res.back() << endl;
return 0;
}
03合规用户名(string)
问题描述
输入一个字符串s
,将这个字符串转换为合规的用户名。用户名必须仅为小写英文字母。请你把字符串s
内的所有英文字母转为小写,同时删除所有其他字符。
输入描述
一个字符串s
输出描述
一个字符串s
输入样例
abcDEF123
输出样例
abcdef
参考代码
#include<iostream>
#include<string>
using namespace std;
int main(){
string s, res;
cin>>s;
for(int i=0;i<s.size();i++){
if(s[i]>='A'&&s[i]<='Z'){
s[i] += 'a'-'A';
}
if(s[i]>='a'&&s[i]<='z'){
res.push_back(s[i]);
}
}
cout<<res;
}
04字符串中字符统计(unordered_map)
问题描述
输入一个字符串s
,以及n
个字符,请输出这些字符在字符串中出现的次数。
输入描述
第一行为一个字符串s
,以及一个正整数n
随后是n
行,每行一个字符
输出描述
n
行,每行对应输入中第n
字符在字符串中出现的次数。
输入样例
abcc 3
a
b
c
输出样例
1
1
2
参考代码
#include<iostream>
#include<string>
#include<unordered_map>
using namespace std;
int main(){
int n;
string s;
unordered_map<char, int> map;
cin >> s >> n;
// 利用哈希表计数
for (char c:s){
map[c]++;
}
for (int i=0;i<n;i++){
char c;
cin >> c;
cout<<map[c]<<endl;
}
return 0;
}
05报数(queue)
问题描述
n
个小朋友坐成一个圆圈,编号分别为1、2、3、…、n;第一个小朋友从1开始报数,报到m的小朋友离开座位。然后下一个小朋友接着从1开始报数,直到只剩下1个小朋友,请问这个小朋友的编号是多少?
输入描述
一个正整数n
和一个正整数m
输出描述
一个正整数代表最后一个小朋友的编号
输入样例
10 5
输出样例
3
参考代码
#include<iostream>
#include<queue>
using namespace std;
int main(){
int n,m;
cin>>n>>m;
queue<int> q;
for(int i=1;i<=n;i++){
q.push(i);
}
// 利用队列来模仿报数的过程
int i=1;
while(q.size()>1){
int t = q.front();
q.pop();
if(i==m){
i=1;
continue;
}
q.push(t);
i++;
}
cout<<q.front();
return 0;
}
06括号匹配(stack)
问题描述
给定一个只包括(
,)
的字符串s
,判断字符串是否有效,有效则输出Yes
,无效则输出No
。
有效字符串需满足:
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的左括号。
输入描述
一个只包括(
,)
的字符串s
输出描述
有效则输出Yes
,无效则输出No
输入样例
()(()(()))
输出样例
Yes
参考代码
#include<iostream>
#include<string>
#include<stack>
using namespace std;
int main(){
stack<char> st;
string s;
cin>>s;
for(char c:s){
if (c=='('|| c=='['){
// 记录左括号
st.push(c);
}else{
// 缺少左括号
if(st.empty()){
cout<<"No"<<endl;
return 0;
}
// 左括号不匹配
if( (st.top()=='(' && c==']') || (st.top()=='[' && c==')')){
cout<<"No"<<endl;
return 0;
}
// 左右括号匹配
st.pop();
}
}
// 左右括号数量一致
if(st.empty()){
cout<<"Yes"<<endl;
return 0;
}
// 缺少右括号
cout<<"No"<<endl;
return 0;
}
其实只要声明一个整型变量a=0,遇到左括号+1,遇到右括号-1,小于0就说明不符合。当然,这也符合栈的思想
07获奖名次(排序)
问题描述
输入一个正整数n
接下来的n
行包含一个字符串s
以及一个正整数k
代表运动员的姓名和得分 。
运动员将根据得分决定名次 ,其中名次第 1 的运动员得分最高,名次第 2 的运动员得分第 2 高,依此类推。
请按得分从高到低输出所有运动员的姓名。
输入描述
输入一个正整数n
接下来的n
行包含一个字符串s
以及一个正整数k
代表运动员的姓名和得分 。
输出描述
输出n
行
每行包含一个字符串s
为运动员的姓名 。
输入样例
3
Peter 90
Joe 100
Douglas 80
输出样例
Joe
Peter
Douglas
参考代码
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;
struct Ath{
string name;
int score;
};
// 基于分数排序
bool cmp(Ath a, Ath b){
return a.score > b.score;
}
int main(){
vector<Ath> aths;
int n;
cin>>n;
for(int i=0;i<n;i++){
Ath t;
cin>>t.name>>t.score;
aths.push_back(t);
}
sort(aths.begin(), aths.end(),cmp);
for(int i=0;i<n;i++){
cout<<aths[i].name<<endl;
}
return 0;
}
08无重复字符的最长子串(综合应用)
问题描述
给定一个字符串s
,请你找出其中不含有重复字符的最长子串的长度。
输入描述
一个不含空格的字符串s
输出描述
一个整数,表示最长子串的长度
输入样例
abcabcbb
输出样例
3
参考代码
#include<iostream>
#include<string>
#include<queue>
#include<unordered_map>
using namespace std;
int main(){
int res=0;
queue<char> q;
unordered_map<char, bool> map;
string s;
cin>>s;
for(char c:s){
// 出现重复字符
while(map.count(c)){// 逐个出队,直到没有重复
map.erase(q.front());
q.pop();
}
q.push(c);
map[c] = true;
if (q.size()>res) res = q.size();
}
cout<<res;
return 0;
}
abcbb
输出样例
3
参考代码
#include<iostream>
#include<string>
#include<queue>
#include<unordered_map>
using namespace std;
int main(){
int res=0;
queue<char> q;
unordered_map<char, bool> map;
string s;
cin>>s;
for(char c:s){
// 出现重复字符
while(map.count(c)){// 逐个出队,直到没有重复
map.erase(q.front());
q.pop();
}
q.push(c);
map[c] = true;
if (q.size()>res) res = q.size();
}
cout<<res;
return 0;
}