【每天算法3】:用java语言实现,二维Vector的排序组合
2010-03-25 14:02
375 查看
题目:
有一个二维Vector,每个元都是字符串(或者其他对象),如下面这个三行,每行元素不固定的二维Vector V。
A、B、C、D
H、I、J、K、M
X、Y、Z
求出满足以下条件的所有Vector D(一定是所有可能的情况):
1.此Vector D的元素包含V的所有元素,且每个元素仅出现一次
2.
此Vector
D中包含在V[1]中的元素之间的顺序不能发生改变,即A、B、C、D之间的顺序不发生改变,同理,V[2]、V[3]。都不发生改变。对于本例,也就是
说,在结果D中,A、B、C、D的先后顺序不变,H、I、J、K、M的先后顺序不变,X、Y、Z的先后顺序不变。结果D的几种可能的情况是:
1:A、B、C、D、H、I、J、K、M、X、Y、Z
2:H、I、A、B、C、X、D、J、K、Y、Z、M
3:A、H、I、X、Y、Z、B、C、J、K、M、D等等
写的不是很好。写着写着脑子就有点乱了。算了,就先这样吧。
明天的题目:
编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。 但是要保证汉字不被截半个,如“我ABC”4,应该截为“我AB”,输入“我ABC汉DEF”,6,应该输出为“我ABC”而不是“我ABC+汉的半个”。
有一个二维Vector,每个元都是字符串(或者其他对象),如下面这个三行,每行元素不固定的二维Vector V。
A、B、C、D
H、I、J、K、M
X、Y、Z
求出满足以下条件的所有Vector D(一定是所有可能的情况):
1.此Vector D的元素包含V的所有元素,且每个元素仅出现一次
2.
此Vector
D中包含在V[1]中的元素之间的顺序不能发生改变,即A、B、C、D之间的顺序不发生改变,同理,V[2]、V[3]。都不发生改变。对于本例,也就是
说,在结果D中,A、B、C、D的先后顺序不变,H、I、J、K、M的先后顺序不变,X、Y、Z的先后顺序不变。结果D的几种可能的情况是:
1:A、B、C、D、H、I、J、K、M、X、Y、Z
2:H、I、A、B、C、X、D、J、K、Y、Z、M
3:A、H、I、X、Y、Z、B、C、J、K、M、D等等
package com.sw.suanfa.first.ten; import java.util.Vector; /** * 有一个二维Vector,每个元都是字符串(或者其他对象),如下面这个三行,每行元素不固定的二维Vector V。 A、B、C、D H、I、J、K、M X、Y、Z 求出满足以下条件的所有Vector D(一定是所有可能的情况): 1.此Vector D的元素包含V的所有元素,且每个元素仅出现一次 2. 此Vector D中包含在V[1]中的元素之间的顺序不能发生改变,即A、B、C、D之间的顺序不发生改变,同理,V[2]、V[3]。都不发生改变。对于本例,也就是说,在结果D中,A、B、C、D的先后顺序不变,H、I、J、K、M的先后顺序不变,X、Y、Z的先后顺序不变。结果D的几种可能的情况是: 1:A、B、C、D、H、I、J、K、M、X、Y、Z 2:H、I、A、B、C、X、D、J、K、Y、Z、M 3:A、H、I、X、Y、Z、B、C、J、K、M、D等等 * @author songwei *解决方案:递归中方法:首先找出下一个位置能出现的字符。 *比如第一次为A,H,X可以出现在第一个位置。 *则对其进行循环。 *当取第一个为A的时候,游标数组表示为[1,0,0]。意思为,第一个childV下次取值位置为第二个位置。然后进入下一个取值, * 下一次取值为范围根据游标可得为B,H,X。循环,当取B时,游标数组表示为[2,0,0]。可以保证一个childV中的数值顺序不会乱掉。 *........依此进行循环递归即可。 *我这里没有考虑childV中自身有重复,比如A、B、C、D、B、C、D *以及两个childV中存在重复[A、B、C、D] [H、I、A、B、C、D、J、K、M] *感觉有点复杂了!谁能更好的处理,请给我个代码哈。 */ public class ComposeVector { private static Vector<Vector<String>> parentV = new Vector<Vector<String>>(); public static void main(String[] args) { Vector<String> childV1 = new Vector<String>(); childV1.add("A"); childV1.add("B"); // childV1.add("C"); // childV1.add("D"); Vector<String> childV2 = new Vector<String>(); childV2.add("H"); // childV2.add("B"); childV2.add("I"); // childV2.add("J"); // childV2.add("K"); Vector<String> childV3 = new Vector<String>(); childV3.add("X"); childV3.add("Y"); // childV3.add("Z"); parentV.add(childV1); parentV.add(childV2); parentV.add(childV3); int[] cursor = new int[parentV.size()]; getNextString(cursor,new Vector<String>()); } /** * * @param cursor 游标序列。其中数组下标表示parentV中的各个childV的序号,数组值对应该childV中被取值的位置。 * @param currentVector 当前序列 * */ public static void getNextString(int[] cursor,Vector<String> vector){ Vector<String> next = new Vector<String>(); int nullNum = 0; for(int i=0;i<parentV.size();i++){ Vector<String> tmp = parentV.get(i); int cursorTmp = cursor[i] ; if(tmp.size()<=cursorTmp){ next.add(null);//用null来区分。 nullNum ++ ; }else{ next.add(tmp.get(cursorTmp)); } } if(next.size() == nullNum){ outVector(vector); return ; } for(int j=0;j<next.size();j++){ String nextVectorStr = next.get(j); if(nextVectorStr == null) continue ; //对currentVector和游标数组进行clone后,再进行操作,以免影响下次循环的传值。 Vector<String> currentVector = (Vector<String>)vector.clone(); int[] currentCursor = cursor.clone(); currentVector.add(nextVectorStr); int cu = currentCursor[j]; currentCursor[j] = cu+1 ;//将该字符所在的Vector的游标+1 getNextString(currentCursor, currentVector); } } /** * 打印Vector * @param v 需打印的Vector */ public static void outVector(Vector<String> v){ for(String t:v){ System.out.print(t); System.out.print(" "); } System.out.println(""); } }
写的不是很好。写着写着脑子就有点乱了。算了,就先这样吧。
明天的题目:
编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。 但是要保证汉字不被截半个,如“我ABC”4,应该截为“我AB”,输入“我ABC汉DEF”,6,应该输出为“我ABC”而不是“我ABC+汉的半个”。
相关文章推荐
- 【每天算法2】:用java语言实现,一个组数:122345这6个数,打印出它所有可能的组合;要求4不能在第3位,3和5不能相连。
- 每天一个数据结构——三种简单排序算法及Java实现
- 实现Vector容器的增加、删除、排序(算法函数排序)、遍历、复制操作
- 图解算法练习--选择排序(PHP实现)
- 算法实现:在10个数中选6个数,显示所有组合
- 高效率的排列组合算法(java实现)
- java实现排序算法之2-路插入排序,直接插入排序,折半插入排序
- Java实现通用组合算法
- 【每天一道算法题】时间复杂度为O(n)的排序
- JavaScript实现二维坐标点排序效果
- 白话经典算法系列之四 直接选择排序及交换二个数据的正确实现
- Java通过几种经典的算法来实现数组排序
- SQL语句实现表中字段的组合累加排序
- 插入排序,合并排序,堆排序,快速排序,计数排序的实现(算法导论)
- Sql语句排序的算法 是不是应用经典算法冒泡法实现的?
- 排列组合之排列问题的算法实现
- 3.快速排序——啊哈算法java实现
- [原] 淘宝SKU组合查询算法实现
- 全排列和组合的实现算法
- 冒泡排序、选择排序、插入排序 算法实现