日期:2014-05-20  浏览次数:20677 次

求教,中软java笔试的一道题?
给定如下数组:
String[] ls={"A","B","C","V","G","H","K"};
String[] ses={"B","G","K"};
要求参照数组ses中的字母顺序对数组ls进行优先排序,对没有在ses数组中出现的字母排在数组的最后,不用排序,最后输出排好顺序的数组ls.

请大神指教~
中软 中软卓越 java

------解决方案--------------------
如果说ses数组里的元素在ls中都有的话

String[] ls={"A","B","C","V","G","H","K"};
String[] ses={"B","G","K"};
List<String> list1=new LinkedList<String>(Arrays.asList(ls));
List<String> list2=Arrays.asList(ses);
list1.removeAll(list2);//移除list1中存在的list2的元素
list1.addAll(0, list2);//再把这些元素放到首位
ls=list1.toArray(new String[list1.size()]);
System.out.println(Arrays.toString(ls));

------解决方案--------------------
考虑到ses中的字母可能在ls中重复出现,需要为ses中的每个字母建立一个数组,另再建一个数组用于存储非ses中的字母,已题中为例:
先建一个行数为ses.length+1的二维动态数组,
然后为ses的字母打张表,非ses中的字母标为-1,ses中的字母标上字母在ses中的索引,然后遍历ls每个字母取出其在表中的值,如果为-1,添加到二维数组最后一行,如果不为-1,添加到已该值为索引的行,最后遍历该二维数组依次输出即可,时间,空间复杂度均为O(n)
------解决方案--------------------

public static void main(String[] args) {
String[] ls = { "A", "B", "C", "V", "G", "H", "K" };
String[] ses = { "B", "G", "K" };
sort(ls,ses);
}

private static void sort(String[] ls,String[] ses) {
Map<String,Integer> map = new LinkedHashMap<String,Integer>();
for (String s : ses) {
map.put(s, 0);
}
for (String s : ls) {
map.put(s, 1);
}
LinkedList<String> list = new LinkedList<String>();
for (String key : map.keySet()) {
if(map.get(key) > 0) list.add(key);
}
System.out.println(list);
}