今天收到一个面试题:给了一个数组(如: ["cars", "thing", "scar", "dog", "god", "arcs", "the"]),需要把由颠倒字母顺序组成的单词放到同一个数组(生成后的结果:[["cars", "scar", "arcs"], ["thing"], ["dog", "god"], ["the"]]


我是这么实现的:

package com.mingyisoft.bean.test;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import org.apache.commons.lang3.ArrayUtils;
public class SameWordUtile {
/**
 * 比较两个字符串组成是否相同
 * 
 * @param sourceStr 
 * @param targetStr
 * @return
 */
public static boolean checkSimilarDegree(String sourceStr, String targetStr) {
boolean checkResult = false;
if (sourceStr.length() == targetStr.length()) {
char[] sourceStrCharArray = sourceStr.toCharArray();
char[] targetStrCharArray = targetStr.toCharArray();
int n = targetStrCharArray.length;
for (int i = 0; i < n; i++) {
checkResult = false;
for (int j = 0; j < sourceStrCharArray.length; j++) {
if (targetStrCharArray[i] == sourceStrCharArray[j]) {
// 从数组中删除已经比较相同的
sourceStrCharArray = ArrayUtils.remove(
sourceStrCharArray, j);
checkResult = true;
break;
}
}
}
}
return checkResult;
}
/**
 * 分组处理
 * @param sourceArray
 * @return
 */
public static Object[] classify(String[] sourceArray) {
// 获取数组的个数
int sourceArrayLength = sourceArray.length;
// 声明临时的Map,用来存放生成后的数组。
Map<String, String[]> tempMap = new HashMap<String, String[]>();
boolean hasSame = false;
for (int i = 0; i < sourceArrayLength; i++) {
hasSame = false;
if (i == 0) {
// 如果是数组的第一个字符串,则初始化Map的值
tempMap.put(sourceArray[i], new String[] { sourceArray[0] });
} else {// 不是第一个数组的话,则开始比较
Set<Entry<String, String[]>> entrySet = tempMap.entrySet();
for (Entry<String, String[]> entry : entrySet) {
String keyString = entry.getKey();
// 判断是否已经存在相似的
if (checkSimilarDegree(keyString, sourceArray[i])) {
// 存在相似的,则把相似的放到对应的数组里面
entry.setValue(ArrayUtils.add(tempMap.get(keyString),
sourceArray[i]));
hasSame = true;
break;
}
}
if (!hasSame) {
// 不存在相似的,新建一个key-value,key使用该数组的字符串,value采用新建的数组(包含该字符串)
tempMap.put(sourceArray[i], new String[] { sourceArray[i] });
}
}
}
return  tempMap.values().toArray();
}
public static void main(String[] args) {
String[] sourceArray = new String[] { "cars", "thing", "scar", "dog",
"god", "arcs", "the","het" };
Object[] targetObjectArr = classify(sourceArray);
for(Object tempObj:targetObjectArr){
String[] ss = (String[]) tempObj;
System.out.println(ArrayUtils.toString(ss));
}
}
}


注:面试结果是算法太复杂,应该比这还高效的算法。