周五面试了一家IT公司,出了这样一道面试题。将字符串中的内容去重按字母分组
内容是String aa="abc,smd,ca,bba,acb,cab,ca,ac,ab";
输出:abc,acb,cab ca,ac smd bba,ab
当时考虑的是去重然后迭代去对比,想的及其复杂。搞了一个多小时。外加紧张,问题多多,导致没整出来。 出来以后同事给我说你怎么不用TreeMap集合自带的排序去解决?我顿时就把心中的郁闷抛开了。不然回家以后一天不会吃下去饭。
下面是回家以后敲出来的代码,两种方法。
方法一:TreeMap
public static void main(String[] args) {
// TODO Auto-generated method stubring
//去重排序,分组
String aa="abc,smd,ca,bba,acb,cab,ca,ac,ab";
String[] aas = aa.split(",");
TreeMap<String, String> treeMap=null;
List<TreeMap<String, String>> arrayList = new ArrayList<>();
for (String str : aas) {
treeMap = new TreeMap<>();
for (int i = 0; i < str.length(); i++) {
treeMap.put(str.substring(i, i+1), str);
}
arrayList.add(treeMap);
}
Map<String, String> dataMap = new HashMap<>();
for (TreeMap<String, String> map : arrayList) {
Iterator<String> it = map.keySet().iterator();
StringBuilder sst=new StringBuilder();
String value = null;
while (it.hasNext()) {
String next = it.next();
sst.append(next);
value = map.get(next);
}
if(dataMap.get(sst+"")==null){
dataMap.put(sst+"", value);
}else{
String string = dataMap.get(sst+"");
if(!string.contains(value)){
dataMap.put(sst+"",string+","+value);
}
}
}
System.out.println(dataMap);
}
结果如下:{abc=abc,acb,cab, ac=ca,ac, dms=smd, ab=bba,ab}
方法二: Collections.sort(arrayList); 利用集合中自带的sort排序方法
public static void main(String[] args) {
String aa="abc,mc,cd,cm,aab,abb,bac,abc";
String[] split = aa.split(",");
List<String> arrayList = null;
Map<List<String>, Object> hashMap = new HashMap<>();
for (String string : split) {
arrayList=new ArrayList<>();
for (int i = 0; i < string.length(); i++) {
arrayList.add(string.substring(i, i+1));
}
Collections.sort(arrayList);
if(hashMap.get(arrayList)!=null){
String st = hashMap.get(arrayList).toString();
if(!st.contains(string))
hashMap.put(arrayList, hashMap.get(arrayList)+","+string);
}else{
hashMap.put(arrayList, string);
}
}
System.out.println(hashMap);
}
输出结果:{[c, d]=cd, [c, m]=mc,cm, [a, b, b]=abb, [a, b, c]=abc,bac, [a, a, b]=aab}
-------------------------------------------------------------------------------------------------------------------------------------
还有一个是将字符串按长短分组。这是当时那个面试官奇哥问我的,当时紧张大脑感觉像是空白状态,被大佬的技术深深折服。
回家以后冷静下来花了十多分钟自己也敲了两边。考研的是逻辑思维能力。很简单如果思路不清晰,就会短片。
代码如下:
public static void main(String[] args) {
String aa="张三,历史,数学,王大妈,李大爷,请了备受,12345";
String[] sp = aa.split(",");
Map<Integer, String> hashMap = new HashMap<>();
for (String str : sp) {
if(null==hashMap.get(str.length())) {
hashMap.put(str.length(), str);
}else{
hashMap.put(str.length(), hashMap.get(str.length())+","+str);
}
}
System.out.println(hashMap);
}
结果如下:
{2=张三,历史,数学, 3=王大妈,李大爷, 4=请了备受, 5=12345}
这次面试没通过,但是给我的收获是蛮多的。希望多多向那些老一辈的开发前辈学习。当然我相信问题的解决方法不只是这几种,如果大家有什么更好的思路也可以交流一下。