【实验五】题解

T1:缺失的数字

题目描述;

我是敦立坤的爹!!!
一个整数集合中含有n个数字,每个数字都在0n之间。假设0n的n+1个数字中有且仅有一个数字不在该集合中,请找出这个数字。


分析:

这里引用一个桶的思想
我们设 a [ x ] a[x] a[x]表示数字x是否出现过

这个时候下标x不再是一个寻常数组的编号,而是一个“值”
里面存放的是数值为x的数字的有关信息(比如是否出现过,出现过几次等等)

利用这种思路,就可以解决这道题


Code

#include<bits/stdc++.h>
using namespace std;

int a[10100];

int main(){
    int x;
    cin>>x;
    for (int i = 0,y; i < x; i++)
      cin>>y , a[y] = 1;//出现了一个数字y,就标记一下 
    for (int i = 0; i <= x; i++)
      if (!a[i]) cout<<i;//如果当前数字没出现过就输出 
    return 0;
}

T2:查找最长单词

题目分析:

在进行文章重复度检查时,经常需要统计一段英文中的单词数量,并找出长度最长的单词。


分析:

以空格为分隔,找出单词即可。
并求出长度最长的单词
注意需要在字符串后面加上一个空格,确保能取出最后一个单词


Code

#include<bits/stdc++.h>
using namespace std;

string s;
int Max = 0;
string Maxx = "";
int num = 0;

int main(){
    getline(cin,s);s+=' ';//加空格 
    string now = "";
    for (int i = 0 ; i < s.size(); i++)
      if (s[i] == ' '){
          num++;//出现次数加一 
          if (Max < now.size()) Max = now.size() , Maxx = now;//纪录最大 
          now = "";
       } 
       else now+=s[i];//加上 
    cout<<num<<' '<<Max<<' '<<Maxx;
    return 0;
}

T3:到底买不买

题目描述:

太长了不管了


分析:

我们假设想要的串是要的串
商家的串是给的串
首先借用桶的思想,利用map(关于map这里有)统计出给的串中每一个字符出现的个数( M [ c ] M[c] M[c]表示字符c出现的次数)
然后遍历要的串,假设当前遍历到的字符为 c c c
如果这个时候 M [ c ] M[c] M[c]不为0,说明这个时候给的串里面还有多的 c c c,那么就让 M [ c ] − − M[c]-- M[c],然后继续遍历匹配
如果这个时候 M [ c ] = 0 M[c]=0 M[c]=0,说明当前给的串里面已经没有当前字符了,那么就不符合,并且缺少的个数加一

如果合法,那就输出两个字符串的长度差
不合法就输出个数
这样就ok了


Code

#include<bits/stdc++.h>
using namespace std;

map < char , int > M;
string s1,s2;

int main(){
    cin>>s1>>s2;
    for (int i = 0; i < s1.size(); i++)
    M[s1[i]]++;//给的串里统计个数
    bool f = 1;
    int cnt = 0;
    for (int i = 0; i < s2.size(); i++){
        if (M[s2[i]]!=0) M[s2[i]]--;
        else f = 0,cnt++;//不可以,个数加1
	}
 	if (f) cout<<"Yes"<<' '<<s1.size()-s2.size();
	else cout<<"No"<<' '<<cnt;
    return 0; 
}


T4:

逆波兰式运算规则:
在这里插入图片描述

不想手写于是就嫖了
没有思想难度只是模拟这个过程
而且这道题里面不存在(),于是过程更加简单

什么是栈?
栈是一个满足先进后出的一个数据结构
最先进去的元素被压入栈底
新进去的元素就是栈顶
我们的操作只能对栈顶进行操作:
1、出栈,就是弹出栈顶元素(并输出)
2、入栈,在栈顶新加入一个数

其实用数组也可以模拟这个过程
关于更加详尽的栈的描述,可以取搜索其他博客
这里就不再赘述


Code

#include<bits/stdc++.h>
using namespace std;

string s;
map < char , int > M;
stack < char > st;

int main(){
    M['+'] = 0 , M['-'] = 0 , M['*'] = 1 , M['/'] = 1;
    cin>>s;
    for (int i = 0; i < s.size(); i++){
    	if (s[i]>='a' && s[i]<='z') {cout<<s[i];continue;}
    	if (st.size() == 0) {st.push(s[i]);continue;}
    	while (st.size() && M[s[i]] <= M[st.top()]) cout<<st.top(),st.pop();
    	st.push(s[i]);
 	}
 	while (st.size()) cout<<st.top(),st.pop();
 	return 0;
} 
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值