您的位置:首页 > 编程语言

去哪儿2013笔试编程

2015-09-20 14:23 281 查看
题意:给定一个整形数组,对这个整形数组排序,使得按序拼接成的值最小。如【3,83,8,13,1】->【1,13,3,83,8】

思路:先根据每个数的第一个数字大小排序【(13,1),(3),(83,8)】,然后再分组排序【(1,13),(3),(83,8)】。分组排序时位数不够补当前第一位的值(83,8)比较转化为(83,88)比较。

#include<iostream>
#include<cstdio>
#include<stack>
#include<vector>
using namespace std;
void intToDigit(int x, int y[])
{
stack<int>st;
while(!st.empty())
st.pop();
while(x)
{
st.push(x%10);
x/=10;
}
int i = 0;
while(!st.empty())
{
y[i++] = st.top();
st.pop();
}
}
int Judge(int index, int a[], int b[])
{
for(int i = 0;i < 10; i++)
{
int x = a[i]==-1?index:a[i];
int y = b[i]==-1?index:b[i];
if(x > y)
return 1;
}
return 0;
}
void Sort(int index, vector<int> vt, int a[][10])
{
if(vt.size() == 0)
return ;
for(int i = 0; i < vt.size(); i++)
{
for(int j = i + 1; j < vt.size(); j++)
{
if(Judge(index, a[vt[i]], a[vt[j]]))
{
int tmp[10];
for(int k = 0; k < 10; k++)
{
tmp [k] = a[vt[i]][k];
a[vt[i]][k] = a[vt[j]][k];
a[vt[j]][k] = tmp[k];
}
}
}
}
}
int main()
{
int data[1000];
int a[1000][10];
vector<int>vt[10];
for(int i = 0; i < 10; i++)
vt[i].clear();
int n;
cin>>n;
for(int i = 0; i < n; i++)
{
cin>>data[i];
for(int j = 0; j < 10; j++)
a[i][j] = -1;
intToDigit(data[i], a[i]);

}
for(int i = 0; i < n; i++)
{
for(int j = i + 1; j < n; j++)
{
if(a[i][0] > a[j][0])
{
int tmp;
for(int k = 0; k < 10; k++)
{
tmp = a[i][k];
a[i][k] = a[j][k];
a[j][k] = tmp;
}
}
}
}
for(int i = 0; i < n; i++)
{
vt[a[i][0]].push_back(i);
}
for(int i = 0; i < 10; i++)
{
Sort(i, vt[i], a);
}
for(int i = 0; i < n; i++)
{
for(int j = 0; a[i][j] != -1; j++)
cout<<a[i][j]<<" ";
cout<<endl;
}
return 0;
}(仅作参考)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: