今天收到一个面试题:给了一个数组(如: ["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)); } } }
注:面试结果是算法太复杂,应该比这还高效的算法。