默认java实现吧,要求如下:
现有N条数据(为实现方便,N设为1000吧,并且数据无重复),共分为M个类型(M设为100吧)
现在我要输出这N条数据,一条一条的输出,要求任意相临的两条数据类型都不一样,并且,任意同类型的两条数据间隔要尽可能的离得最远,并且同类型的数据不考虑先后顺序(这个可能不好理解,下面我用实例说明)
为举例说明方便,我N为5吧,M为3,类型用数据类型,数字、字母、中文表示,数据如下:
1.123
2.abc
3.中文1
4.中文2
5.456
我按上面的要求排完序后,输出如下:
1.123
2.中文1
3.abc
4.中文2
5.456

1.中文1
2.123
3.abc
4.456
5.中文2
下面输出不要求:
1.中文1
2.123
3.abc
4.中文2
5.456
为何不合要求呢?因为,没有做到“最远距离”原则,此时,最远的距离只隔2条数据,而上面符合要求的“最远距离”隔了3条数据,所以正确。
当然了,这只是5数据,写起来不难,当N条数据时,就没那么简单了吧?
大虾們可以发挥了,再提醒下,注意红色字体的理解,任意同类型,不是说把其中的一个类型两条数据隔得最远就好了,还有兼顾别的类型。
还不大理解本算法的,可以跟贴发问。
本人将选出最佳的那种算法100分奖励(或公认最佳的那种算法),其实优秀的看情况奖励了,呵。
分不是目的,主要还是看下练下身手吧(话说如果我是面试官就最爱考这样的题,呵,离题了,可以发挥了)

解决方案 »

  1.   

    现有N条数据(为实现方便,N设为1000吧,并且数据无重复),共分为M个类型(M设为100吧)比较奇怪的是怎么去评价最终结果是否正确,尤其是M有100个的情况下。比如原始数据是:
    1.1111
    2.2222
    3.AA
    4.BB结果一:
    1.1111
    3.AA
    2.2222
    4.BB结果二:
    1.1111
    3.AA
    4.BB
    2.2222
    如何判定哪种更好?是否按照所有类型中最短间隔来评价?也就是结果一是1;而结果二是0?
      

  2.   

    刚没认真看,不好意思,你说的这个例子,我主贴已经说过很清楚了啊,你二的结果都不正确了,怎么还能比较呢?
    1.1111
    3.AA
    4.BB
    2.22223条与4条,类型都一样了,怎么还可以“在一起”?此种情况结果是错的了,虽然1,2条间隔最大,但这要在结果正确的情况下间隔最大才有意义啊,再认真看下我贴子中的要求吧。
    还要注意一个问题,优先条件。
    所谓间隔最大,要保证任意相隔的两条数据类型不一样的情况下间隔最大(说得有点乱,应该能懂了吧?)
      

  3.   

    类型越多,最大间隔会越小,这个不言而喻,如果一千条数据,只有两种类型,并且数据量各占一半,即各500条,那么,只能交叉的排序了,此时间隙为0。
    对了,补充下一个BUG或漏洞吧,类型数目至少为总条数的一半或以上吧(否则会出现无法实现任意两条相隔类型要不一样的情况)
    估计这题还真有点难处理,点进来看的人不少,会的人估计不多,再降低点难度,要求再降低些,把尽可能要求间隔最大去掉,即能实现任意两条间隔不为同类型就好了。(这样应该好写点了,初步想法用插入法)
      

  4.   

    其实初步有一个算法思路,不考虑时间和空间最优化的问题,不过还需要继续细化了:
    1、先准备M个桶,桶有个属性:init,桶初始化后的总大小;
    2、把N条数据先全部分类装入M个桶中,并记录好每个桶的init;
    3、准备排序后输出结果的数组Result,也即要准备N个位置;
    4、按M个桶init大小降序遍历;
    5、  将当前桶的所有元素,平均放置到N个位置的空位中;
    6、  循环直到M个桶轮询完毕;
    7、按顺序输出Result。整体思路比较简单,因为最优解主要依赖于数量最多的那个分类,所以优先解决数量最多的;算法中主要需要细化的是 5。
      

  5.   

    你的思路跟我想得差不多类似的了,我现在纠结的是,第5步,如何做到“平均放置”?当然,数目最多的那个类要先放是肯定的了,问题是,放完数目最多的那个类后,放第二多的那个类,貌似不好“放进去了”。
    这里,我想的是用ArrayList,当然用数组也一样,第一次放时,能保证平均放,第N次放时,由于前面有放数据了,有可能会导致放不进去的情况。(由于数目不一定那么刚好整除啊,整除的话,也好处理点,除不尽的,平均起来,就会有问题了)