一、题目
二、思路(自己)
class Solution {
public String[] findRestaurant(String[] list1, String[] list2) {
// Map<Integer,String> map=new TreeMap<>();
List<String> res=new ArrayList<>();
//找出两个数组中相同的口味
for (int i = 0; i < list1.length; i++) {
String s1=list1[i];
for (int j = 0; j <list2.length ; j++) {
String s2=list2[j];
if(s1.equals(s2)){
int sum=i+j;
String s=sum+s1;
res.add(s);
}
}
}
Collections.sort(res);
// System.out.println(res);
String s3=res.get(0);
int first= Integer.parseInt(s3.substring(0,1));
List<String> ans=new ArrayList<>();
ans.add(s3.substring(1));
for (int i = 1; i <res.size() ; i++) {
int s4= Integer.parseInt(res.get(i).substring(0,1));
if(s4!=first)
break;
else ans.add(res.get(i).substring(1));
}
// System.out.println(ans);
String[] s5=new String[ans.size()];
return ans.toArray(s5);
}
}
- KFC下标和为11,导致在比较时只比较了1,所以输出错误。
- 现在的修改方法是,我觉得用list这条路行不通,还是用map进行存储,键为口味,值为下标和,修改比较器即可实现了。
- 后发现原来treemap不能直接通过值来进行排序,只能通过把TreeMap的EntrySet转换成list,然后使用Collections.sort排序,说做就做
class Solution {
public String[] findRestaurant(String[] list1, String[] list2) {
Map<String,Integer> map=new TreeMap<>();
// List<String> res=new ArrayList<>();
//找出两个数组中相同的口味
for (int i = 0; i < list1.length; i++) {
String s1=list1[i];
for (int j = 0; j <list2.length ; j++) {
String s2=list2[j];
if(s1.equals(s2)){
map.put(list1[i],i+j);
break;
}
}
}
List<Map.Entry<String,Integer>> res=new ArrayList<>(map.entrySet());
Collections.sort(res,(o1,o2)->o1.getValue().compareTo(o2.getValue()));
int first=res.get(0).getValue();
List<String> l=new ArrayList<>();
l.add(res.get(0).getKey());
for (int i = 1; i <res.size() ; i++) {
if(res.get(i).getValue()!=first) break;
l.add(res.get(i).getKey());
}
String[] s=new String[l.size()];
return l.toArray(s);
}
}
- 这个题目官方定义的难度是简单,其实是挺简单的,但是由于我对Java比较器不够熟悉,导致废了一些功夫,花了将近两个小时才完成。不过通过这个题目我学到了集合比较器的使用和修改,再接再厉!
- 写完看看评论区大佬们的解答,果然我还是太菜了,加油加油!!!
三、题解(官方)
- 官方用的题解是哈希表index,先遍历list1,然后再查找list2中元素是否存在于index中,存在的话就是有相同口味的餐厅,记录下标和
class Solution {
public String[] findRestaurant(String[] list1, String[] list2) {
Map<String, Integer> index = new HashMap<String, Integer>();
for (int i = 0; i < list1.length; i++) {
index.put(list1[i], i);
}
List<String> ret = new ArrayList<String>();
int indexSum = Integer.MAX_VALUE;
for (int i = 0; i < list2.length; i++) {
if (index.containsKey(list2[i])) {
int j = index.get(list2[i]);
if (i + j < indexSum) {
ret.clear();
ret.add(list2[i]);
indexSum = i + j;
} else if (i + j == indexSum) {
ret.add(list2[i]);
}
}
}
return ret.toArray(new String[ret.size()]);
}
}