输入1 67 256 43 这样的一串数字,如何用上所有的数字构成一个最大的数字

xuxichun 2008-04-14 09:43:49
如题,谢谢~
...全文
203 点赞 收藏 22
写回复
22 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
UltraBejing 2008-05-01
关注 接分
回复
rover___ 2008-04-21
排序问题。
回复
Yoon_EunHae 2008-04-19
桶排的原理 做这题很简单
回复
dlingt 2008-04-16
lz问的是 一个个数字分析再去组装,还是在原有的整形去组装,模糊
回复
shshsh_0510 2008-04-16
一旦排好后,去掉最前一个,后面还应该是剩下的n-1个数所排最大的。
设前两个数为a,b
则ab>=ba
如a=311,b=31131120
显然,如要ab=ba,则b以a为循环节循环。
所以两个不等长数的比较方法为:
从长的b中,先除去所有a的循环,再比。 有点像欧几里德辗转相除
回复
nealxhf 2008-04-15
nnd,GetBig多余,
可以直接比较。。。。
回复
nealxhf 2008-04-15
private int[] num = new int[4] { 3111, 311, 31, 2 };
private void ReturnNum()
{
int k;
for (int i = num.Length - 1; i > 0; i--)
{
for (int j = i; j >0; j--)
{
if (GetBig(num[j], num[j - 1]))
{
k = num[j];
num[j] = num[j - 1];
num[j - 1] = k;
}
}
}
int xx = 0;
}
private bool GetBig(int n1, int n2)
{
int n1begin = int.Parse(n1.ToString().Substring(0,1));
int x1 = n1;
int x2 = n2;

if (n1 == n2)
{
x1 = n1 * 10 + n1begin;
x2 = n2 * 10 + n1begin;
}
return bijiao(x1.ToString(),x2.ToString());
}
private bool bijiao(string x1,string x2)
{
int y1 = int.Parse(x1 + x2);
int y2 = int.Parse(x2 + x1);
return y1 > y2;
}
回复
nealxhf 2008-04-15
不管什么样的
323123
32321
32312
32323
31233
31111
3111
311
都在末尾添加首位3
3231233
323213
323123
323233
312333
311113
31113
3113
然后排列下搞定。
两两比较,简写了
a *10^b.length +b 同 b*10^a.length +a
冒泡就足够了
回复
nealxhf 2008-04-15
首位同样的就 排列出来
然后末位添加首位进行排列呗
排列出来后就是原数据顺序
回复
mathe 2008-04-15
前缀相同的基本不难处理
比如
31112
3111
311
这三种情况
我们发现去掉公共部分前缀后,前面余下部分数据分别为1,12,它们都要排在311后面,所以我们知道
3111和31112都排在311后面,同样31112要排在3111后面,因为它们31112去掉3111后,后面的2排在3111后。
真正麻烦的是遇上像
311
311311
311311310
这种情况
不过概率已经很小了,特速处理就可以了。
回复
ls说的是,单纯比较两个数字考虑得太简单了。

考察前面出错的原因,还是对一些前缀相同的数值处理不当,这样可以在原来的算法基础上再改一下:
当前缀相同的时候,把这些相同前缀的数字记录下来,接着往下比较(没有结束的数继续对比低位,已经结束的数另选其它数中高位数值大的)......中间过程会不短的剪枝,到最后会得到唯一的结果。
回复
tailzhou 2008-04-15
举例错误;
最大的应该是31131113111222


当同前缀的数字比较多的时候,情况比较复杂;


回复
可口可乐 2008-04-15
很简单,利用STL的sort,自己写一个compare函数即可



string i2str(int i)
{
stringstream stream;
stream << i;
return stream.str();
}

bool comp(int i1, int i2)
{
string str1 = i2str(i1);
string str2 = i2str(i2);
return (str1+str2 > str2+str1);
}

int main()
{
vector<int> vecElem;
//init vecElem

sort(vecElem.begin(), vecElem.end(), comp);

string str;
for (int i = 0; i < (int)vecElem.size(); i++) {
str += i2str(vecElem[i]);
}

cout << str << endl;
}


回复
tailzhou 2008-04-15
光拼也不行;

比如:
31112
3111
311
22

最大的应该是31122....

对有些特殊数据,估计O(n*lgn)内很难做到;

回复
楼主的意思是要靠原来那几个数组合出一个新的整数吧?ls把原数值都改变了,和楼主的要求好像不符。

[Quote=引用 2 楼 xdspower 的回复:]
其实只需要对每个数字的最高位排序,对最高位相同的比较第二位,以此类推,形成一个依据这个规则的排序数组(比如是降序)A,

A[0]A[1]...A[n] 这样形式的数就是最大的
[/Quote]
基本上是这样,补充一下,如果两个整数位数不相同的话怎么比较。
举个例子,拿312和31来说,前两位数字都相同,但是到了第3位就不一样了,一个是2,一个已经没有数字了。这时候可以把两个数拼在一起比较:
312=>31231
31=>31312
由于31312>31231,所以我们认为31高于312。
这样一来整个算法就完整了,时间复杂度O(n*lgn)
回复
medie2005 2008-04-15
计数排序.
char num[]="16725643";
int c[10]={0};
for( int i; num[i]!='/0'; ++i )
++c[num[i]-'0'];
for( int i=9; i>=0; ++i )
for( int j=0; j<c[i]; ++j )
cout<<i;
cout<<endl;
回复
yhlevin 2008-04-15
mark
回复
hyzhx 2008-04-14
关注
回复
sun3411 2008-04-14
10叉树?
回复
xuxichun 2008-04-14
个人认为排序的话最快也就是O(nlog2n)
还有更快的方法么
回复
加载更多回复
相关推荐
发帖
数据结构与算法
创建于2007-08-27

3.2w+

社区成员

数据结构与算法相关内容讨论专区
申请成为版主
帖子事件
创建了帖子
2008-04-14 09:43
社区公告
暂无公告