心得:
vector容器作为参数传递有三:
1.声明 method(vector<int> vec1),调用method(vec),这传入的是vec的拷贝,即传值,vec和vec1不关联
2.声明 method(vector<int> &vec1),调用method(vec),这传入的是vec的本身,即传引用,vec和vec1指向同一内存
3.声明 method(vector<int> *vec1),调用method(&vec),这传入的是vec的地址,用指针接收,vec和*vec1指向同一内存,但是我不喜欢这种方式,还要值解析,很麻烦,而且前面两个已经可以实现值或址的传递了,所以只记住前两个就好
直接用一个容器赋值给另一个容器,如vector<int> v1,v2; 给v1若干值;v2=v1; v2只是获得了v1的拷贝,他们不关联
这一题需要去重(我认为),<algorithm>有一个unique(iterator t1,iterator t2)左闭右开,但是它并不真正去重,只是把不重复的元素放在前面,而里面会被打乱,返回值是一个指向的是去重后容器中不重复序列的最后一个元素的下一个元素,详情可见(https://www.cnblogs.com/wangkundentisy/p/9033782.html),配合erase可以做到真正去重
题目:
1023 组个最小数 (20分)
给定数字 0-9 各若干个。你可以以任意顺序排列这些数字,但必须全部使用。目标是使得最后得到的数尽可能小(注意 0 不能做首位)。例如:给定两个 0,两个 1,三个 5,一个 8,我们得到的最小的数就是 10015558。
现给定数字,请编写程序输出能够组成的最小的数。
输入格式:
输入在一行中给出 10 个非负整数,顺序表示我们拥有数字 0、数字 1、……数字 9 的个数。整数间用一个空格分隔。10 个数字的总个数不超过 50,且至少拥有 1 个非 0 的数字。
输出格式:
在一行中输出能够组成的最小的数。
输入样例:
2 2 0 0 0 3 0 0 1 0
输出样例:
10015558
思路:
用容器将这些数从小到大装进去,输入的数字就是对应位置的数(0开始)有几个,根据下标装值,数组的值就是装几个,如输入就是装进两个0,两个1,三个5,一个8,然后对零进行特殊化处理,之后按升序输出就行了
代码:
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
bool have_num(vector<int> &have,int a)
{//判断一个数是否在这个容器中,不在的话返回false,否则返回true
vector<int>::iterator it;
for(int i=0;i<have.size();i++)
{
it=find(have.begin(),have.end(),a);
if(it==have.end())
return false;
return true;
}
}
int main()
{
string res;
int temp;
int num[10]={};
vector<int>vec,have;
vector<int>::iterator it,new_end;
for(int i=0;i<10;i++)
{
cin>>temp;
num[i]=temp;
while(num[i]--)//利用数组的值来确定装几次
{
vec.push_back(i);//装下标就是装值
}
}
for(int i=0;i<vec.size();i++)
{
if(!have_num(have,vec.at(i)))
{//将vec中不重复的值放进have中
have.push_back(vec.at(i));
}
}
if(have.at(0)==0)
{//如果have[0]是零的话,那么结果第一个数填have[1]就行了,因为have是去重且排序好的
//除了have[0]之外,最小的肯定就是have[1]了
res.push_back(have.at(1)+'0');
it=find(vec.begin(),vec.end(),have.at(1));
vec.erase(it);//还要在vec中删除一个have[1],因为它已经放进res中了
}
for(int i=0;i<vec.size();i++)
res.push_back(vec.at(i)+'0');//按升序放进res中
cout<<res;
return 0;
}