默认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分奖励(或公认最佳的那种算法),其实优秀的看情况奖励了,呵。
分不是目的,主要还是看下练下身手吧(话说如果我是面试官就最爱考这样的题,呵,离题了,可以发挥了)
现有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.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?
1.1111
3.AA
4.BB
2.22223条与4条,类型都一样了,怎么还可以“在一起”?此种情况结果是错的了,虽然1,2条间隔最大,但这要在结果正确的情况下间隔最大才有意义啊,再认真看下我贴子中的要求吧。
还要注意一个问题,优先条件。
所谓间隔最大,要保证任意相隔的两条数据类型不一样的情况下间隔最大(说得有点乱,应该能懂了吧?)
对了,补充下一个BUG或漏洞吧,类型数目至少为总条数的一半或以上吧(否则会出现无法实现任意两条相隔类型要不一样的情况)
估计这题还真有点难处理,点进来看的人不少,会的人估计不多,再降低点难度,要求再降低些,把尽可能要求间隔最大去掉,即能实现任意两条间隔不为同类型就好了。(这样应该好写点了,初步想法用插入法)
1、先准备M个桶,桶有个属性:init,桶初始化后的总大小;
2、把N条数据先全部分类装入M个桶中,并记录好每个桶的init;
3、准备排序后输出结果的数组Result,也即要准备N个位置;
4、按M个桶init大小降序遍历;
5、 将当前桶的所有元素,平均放置到N个位置的空位中;
6、 循环直到M个桶轮询完毕;
7、按顺序输出Result。整体思路比较简单,因为最优解主要依赖于数量最多的那个分类,所以优先解决数量最多的;算法中主要需要细化的是 5。
这里,我想的是用ArrayList,当然用数组也一样,第一次放时,能保证平均放,第N次放时,由于前面有放数据了,有可能会导致放不进去的情况。(由于数目不一定那么刚好整除啊,整除的话,也好处理点,除不尽的,平均起来,就会有问题了)