牛客周赛 Round 30 A B C D

文章解析了四个C++编程题目,涉及字符串操作(删除字符、正整数转换、构造回文)、算法应用(散列计数、回文判断)以及整数操作(找到整数在给定区间的有效倍数)。
摘要由CSDN通过智能技术生成

A小红的删字符

题解:直接输出首位和最后一位

#include<bits/stdc++.h>
using namespace std;
int main()
{
	string s;
	cin>>s;
	cout<<s[0]<<s[2];
	return 0;
}

B小红的正整数

题解:利用散列的最简单应用,将每一位上的数字作为cnt数组的下标,cnt[i]是用来记录0~9每个数的个数,然后先遍历1~9输出首个cnt[i]不为0的下标,然后立马跳出循环,再然后输完从0~9的每一个数

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int cnt[10];
int main()
{
	ll x;int temp;
	cin>>x;
	while(x>0)
	{
		temp = x%10;
		cnt[temp]++;
		x=x/10;
	}
	//sort(a,a+i);
	
	for(int j=1;j<10;j++)
	{
		if(cnt[j]>0)
		{
			cout<<j;
			cnt[j]--;
			break;
		}
	}
	for(int j=0;j<10;j++)
	{
		for(int k=0;k<cnt[j];k++)
		{
			cout<<j;
		}
	}
}

C小红构造回文

题解:已知一个仅由小写字母组成的字符串,长度不超过105105。保证输入的字符串是回文的

如果无解,请输出 -1。否则重排后的字符串。有多解时输出任意即可

发现当回文串的长度<=3时候一定不满足题目要求:重排后的回文串与原文串不同。当>=4时候,分长度位奇偶去讨评论(下面的代码中count代表字符串中的不同的字母种类数),当长度为偶数时候,count<=1一定不满足要求,反之只需要交换前两个字符和后两个字符输出就可以了;当长度为奇数时,count<=2一定不满足要求,反之(和奇数操作一样),便可以了

#include<bits/stdc++.h>
using namespace std;
int cnt[150];

int main()
{
	string s;
	cin>>s;int count=0;
	for(int i=0;i<s.size();i++)
	{
		cnt[(int)s[i]]++;
	}
	for(int i=97;i<=122;i++)
	{
		if(cnt[i]>0)count++;
	}
	if(s.size()<=3) {cout<<-1;return 0;}
	if(s.size()%2==0)
	{
		if(count<=1)cout<<-1;
		else
		{
			char str = s[s.size()-1];
			s[s.size()-1] = s[s.size()-2];
			s[s.size()-2] = str;
			str = s[0];
			s[0] = s[1];
			s[1] = str;
			for(int i=0;i<s.size();i++)
			{
				cout<<s[i];
			}
		}
	}
	else
	{//cabac
		if(count<=2)cout<<-1;
		else
		{
			char str = s[s.size()-1];
			s[s.size()-1] = s[s.size()-2];
			s[s.size()-2] = str;
			str = s[0];
			s[0] = s[1];
			s[1] = str;
			for(int i=0;i<s.size();i++)
			{
				cout<<s[i];
			}
		}
	}
	return 0;
}

D小红整数操作

#include<bits/stdc++.h>19/
using namespace std;
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);//以上三行可以不用写
    int x,y,l,r;
    cin>>x>>y>>l>>r;
    int g = gcd(x,y);//
    x=x/g;//除以最大公约数使得x尽可能小
    y=y/g;//除以最大公约数使得y尽可能小
    if(x>y){swap(x,y);}//交换使得x为小的,y为大的
    //假设x=3 y=4 l=19 r=41 
    //19/3得到6但发现至少使得3*7才能使得x在[l,r]这个区间里面,即是向上取整
    //下界毋庸置疑一定是r/y得到10

    int minn = l/x + (l%x!=0);//下界一定是向上取整
    int maxx = r/y;//上界一定是向下取整
    cout<<max(0,maxx-minn+1);
    //你想7个3使得x(使得x本身有7次不同的值,y一样)在区间里面,10个4使得y在区间里面,那么10个3也必然在区间里面
    //所以x的倍数可以是[7,10],那么使得x本身能在区间里面的方案就有(上界-下界+1)种
    //但可能种类会有负数的情况,所以输出max(maxx-minn+1)便是正确答案
}

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
牛客 a卷2022年第四季度的华为题目中,要求考生设计一种高效的数据结构,能够支持以下几种操作: 1. 添加一个元素 2. 删除一个元素 3. 查找是否存在某个元素 4. 返回元素的总数 该数据结构要求满足空间复杂度较小、时间复杂度较低、能够快速地进行查找和修改等多种操作。 想要编写这样一种数据结构,我们可以参考许多已有的经典算法与数据结构,如二叉树、哈希表、红黑树等,通过综合利用它们的优点来实现这个问题的解决。 例如,我们可以通过哈希表来存储所有元素的值,并在每个哈希链表的元素中再使用红黑树来进行排序与查找。这样,我们既能够轻松地进行元素的添加和删除操作,也能够在查找较大数据范围和数量时保持较高的速度与效率。同时,由于使用了多个数据结构来协同完成这个问题,我们也能够在空间复杂度上适度地进行优化。 当然,在具体设计这个数据结构的过程中,我们还需要考虑一些实践中的细节问题,例如如何避免哈希冲突、如何处理数据丢失与被删除元素所占用的空间等问题,这都需要相应的算法与流程来进行处理。 总体来看,设计这种支持多种操作的高效数据结构,需要我们具备丰富的算法知识和编程实践能力,同时需要我们在具体处理问题时能够将多种算法和数据结构进行有效地结合。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值