问题描述:给你两个字符串数组,找出这两个数组中相同字符串对应索引之和最小的字符串。
思路:使用map。
原代码:
public String[] findRestaurant(String[] list1, String[] list2) {
String []s=new String[Math.max(list1.length,list2.length)];
int sum=Integer.MAX_VALUE;
List<String> list=new ArrayList<String>();
Map<String,Integer> map=new HashMap<String,Integer>();
for(int i=0;i<list1.length;i++){
map.put(list1[i],i);
}
int totalNum=0;
for(int j=0;j<list2.length;j++){
if(map.containsKey(list2[j])){
int index=map.get(list2[j])+j;
if(sum==index){
s[totalNum]=list2[j];
totalNum++;
}else if(index<sum){
totalNum=0;
s[totalNum++]=list2[j];
sum=index;
}
}
}
String[] res=new String[totalNum];
for(int i=0;i<totalNum;i++){
res[i]=s[i];
}
return res;
}
最佳答案:
public String[] findRestaurant(String[] list1, String[] list2) {
if(list1.length>list2.length) return findRestaurant(list2, list1);
if(list1.length==0) return new String[]{};
Map<String, Integer> index = new HashMap<>();
for(int i=0; i<list1.length;i++){
String rest = list1[i];
index.put(rest, i);
}
int minSum = Integer.MAX_VALUE;
List<String> potentionalAnser = new ArrayList<>();
for(int i=0; i<list2.length;i++){
if(i>minSum) break;
String rest = list2[i];
if(index.containsKey(rest) && (i+index.get(rest)<=minSum)){
if(i+index.get(rest)<minSum){
minSum = i+index.get(rest);
potentionalAnser = new ArrayList<>();
}
potentionalAnser.add(rest);
}
}
String[] result = new String[potentionalAnser.size()];
return potentionalAnser.toArray(result);
}
原生的方法要比自己构建数组更快