一道面试算法题?

来源:百度知道 编辑:UC知道 时间:2024/06/07 05:24:57
把23,3,465,2,57,561,36,35
变成以下形式的二维数组:
23 3 465 57
2 36 561
35

解释:按每个数的第一位数排序,然后把第一位数相同的就直接写下面去。
非常感谢!
这些数据结构是java已经封装好的。如果不用这些呢,就像用c语言写一样。就用数组来搞,好不好搞?感觉难就难在不知道初始化多大的数组。
转成这样之后再怎么转:
23,2,3,36,35,465,57,561.
我搞成这样之后就感觉困难了。

这是典型的桶排序算法,
假设有9个桶,每个桶里存放N个数字。桶应该是唯一的。
所以推出结论:
1。桶是唯一的(我们因此可以利用Hashtable的唯一性来做到);
2。桶内成员可以不排序,因此可以利用数组或者Vector来做到;
3。Hashtable需要主键key来唯一标识,正好数字1~9是不重复的,是唯一的;
3。把每个数值的第一位取出来,以第一位值做为key找到hashtable中的相应vector,再将vector.addElements(该数值);
4。完成;

具体做法:
1.生成桶,9个桶,每个桶以数字1~9做为主键命名
Hashtable table=new Hashtable();
for(int i=1;i<10;i++){
Vector vector=new Vector();
table.put(new String(i), vector);
}
2. 遍历每个数字,将当前数字的第一位分解出来,办法有很多种,比如除十法,这里介绍直接转字符串再取第一位法:
假设你的要处理的数字们放在数组里面int[] tmp;
for(int i=0;i<tmp.length;i++){
int num=tmp[i];
String str=new String(num);
char ch=str.charAt(0);
//压入到桶里,先把想要的桶找到,利用主键
Vector vect=(Vector)table.get(""+ch);
//找到桶后再把数值压到桶里
vect.addElements(new Integer(num));
}

//取出来的时候,有多种方法,一种是利用key取出Vector,再遍历Vector,得到其中元素,元素的key为String, 内容为Integer

另一种方法是先遍历hashtable再遍历vector

同样的应用还有给一幅被洗过的扑克牌