天梯赛第一周刷题 L1-027 出租-20分代码

题目

话不多说看题

下面是新浪微博上曾经很火的一张图:

一时间网上一片求救声,急问这个怎么破。其实这段代码很简单,index数组就是arr数组的下标,index[0]=2 对应 arr[2]=1index[1]=0 对应 arr[0]=8index[2]=3 对应 arr[3]=0,以此类推…… 很容易得到电话号码是18013820100

本题要求你编写一个程序,为任何一个电话号码生成这段代码 —— 事实上,只要生成最前面两行就可以了,后面内容是不变的。

输入格式:

输入在一行中给出一个由11位数字组成的手机号码。

输出格式:

为输入的号码生成代码的前两行,其中arr中的数字必须按递减顺序给出。

输入样例:

18013820100

输出样例:

int[] arr = new int[]{8,3,2,1,0};
int[] index = new int[]{3,0,4,3,1,0,2,4,3,4,4};

思路

第一个问:一开始的思路是,看到了这个题,又是一个字符串操作的题目,首先肯定是预处理出字符串里面有多少种数字,预处理出来后就对他进行排序,剩下的就是格式了,我用了STL里面的set数组,set可以自动帮我们去重,并且还能自动排序,默认从小到大, 本题是需要从大到小,因此我们修改一下就好

set<int,greater<int>> s1;

第二问:我把s1里面的每一个都映射一个下标,用unordered_map进行存储,这里的ma指的是unordered_map<int> ma;

	i = 0;
	for(auto it = s1.begin();it!=s1.end();it++)
	{
		ma[*it] = i;
		i++;
	}

 这样之后,我们就可以对于电话号码,来一个,找一个对应的下标,然后输出就行,注意格式。完整的代码如下:

代码:

由于本蒟蒻还没有找到其他好方法,就先用set容器和unordered_map容器来解决吧

#include<iostream>
#include<set>
#include<algorithm>
#include<unordered_map>
using namespace std;
set<int,greater<int>> s1;
int main()
{
	
	string s;
	cin>>s;
	unordered_map<int,int> ma;
	for(int i = 0;i<s.size();i++)// 放到s1里面,看看多少种并且排序 
	{
		s1.insert(s[i]-'0');
	}
	cout<<"int[] arr = new int[]{"; 
	int i = 0;
	for(auto it = s1.begin();it!=s1.end();it++)// 注意格式,这种往往第一个先判断一下 
	{										//	 后面从第二个开始应该把标点符号先输出 
		if(i==0)
			cout<<*it;
		else
			cout<<','<<*it;
		i++;
	}
	cout<<"};"<<endl;// 别忘了是有分号的 
	i = 0;
	for(auto it = s1.begin();it!=s1.end();it++) // 对每种数字赋予一个下标 
	{
		ma[*it] = i;
		i++;
	}
	cout<<"int[] index = new int[]{";
	for(int i = 0;i<s.size();i++) // 来一个输出一个下标,标点的处理如下 
	{
		if(i==0)
			cout<<ma[s[i]-'0'];
		else
			cout<<','<<ma[s[i]-'0'];
	}
	cout<<"};";
	return 0; 
}

set容器介绍

就利用这题,让自己熟悉一下set容器的用法吧

1、初始化和赋值

  • 空集合初始化(也是最常用):set<int> s1;
  • 通过数组初始化:int arr[] = {1,2,3} , set<int> s1(arr , arr + 3);
  • 拷贝初始化 set<int> anotherSet(s2); s2是另外的set容器

2、插入和删除元素

  • 插入元素: s1.insert(1000);

  • 删除指定的元素: s1.erase(1000);

  • 删除迭代器指向的元素:s1.erase(s1.begin());

  • 清空集合:s1.clear(); 

3、访问元素:

for (auto it = mySet.begin(); it != mySet.end(); ++it) {
    std::cout << *it << ' ';
}

4、查找和计数

  • 查找元素:auto it = s1.find(3);

  • 计数元素(要么1要么0): size_t count = s1.count(3); 

5、返回集合大小

  • 元素个数:size_t size = s1.size();
  • 判断是否为空:bool isEmpty = s1.empty(); 

unordered_map容器介绍

 unordered_map 是 C++ STL(Standard Template Library)中的一个关联容器,它提供了基于键的快速查找功能。unordered_map 在内部使用哈希表来存储键值对,因此其查找、插入和删除操作的平均时间复杂度通常是 O(1)。下面是 unordered_map 的一些常用用法和特点

 1、初始化赋值

最常用的就是直接定义空的初始化

unordered_map<key,value> ma;

这里记住key和value一一对应,key可以是string,也可以是int类型。深刻演绎了关联类型是什么。

2、插入和删除元素

  • 常见插入元素ma[key] = value; 
  • 也可以整个直接ma.insert(key,value);
  • 删除指定键的元素:ma.erase(key);
  • 清空映射: ma.clear();

3、查找和计数

  • 查找元素:auto it = ma.find(key);
  •  计数元素(要么0要么1):size_t count = ma.count(key);

 加油加油加油!!!

  • 22
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
天梯(ACM)是一种面向计算机竞的比形式,即ACM国际大学生程序设计竞。这项比旨在促进学生的计算机科学技能和创新思维,并且是计算机专业学生之间最有声望和重要的竞之一。 在天梯中,参队伍需要在规定的时间内解决多个问,这些问通常是涉及算法、数据结构、自动机等计算机科学领域的难。比中,每个队伍通常有三名队员组成,他们需要一起分析问、设计算法,并通过程序编码来解决问。此外,比规定了每个目的时间和内存限制,参队伍需要在这些限制下得出正确的结果。 在天梯中,要想在短时间内解决尽可能多的问,参队伍必须具备扎实的计算机科学基础知识,并且具有良好的团队合作和沟通能力。他们需要能够迅速分析问、抽象问、设计高效算法,并且通过编程实现。此外,参队伍在备阶段也需要大量的和训练,以提高解能力和熟悉常见的问类型。 天梯不仅考察了参队伍的计算机科学技术水平,也考察了他们的解决问的能力、团队协作能力和时间管理能力。此外,天梯也为参队伍提供了展示和交流的机会,他们可以与其他参队伍分享经验、学习他们的解思路,从中得到启发和提高。 总之,天梯是一项注重计算机科学技术和创新能力的竞,通过比的形式促进学生的学习、交流和提高。它是计算机竞中最具代表性和声望的竞之一,也是培养优秀计算机科学人才的重要途径之一。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值