01数据结构练习题解析

数据结构练习题及参考代码

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;
} 
  • 24
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xuelanghanbao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值