172、兩個列表的最小索引總和
阿新 • • 發佈:2019-01-08
題目描述
假設Andy和Doris想在晚餐時選擇一家餐廳,並且他們都有一個表示最喜愛餐廳的列表,每個餐廳的名字用字串表示。
你需要幫助他們用最少的索引和找出他們共同喜愛的餐廳。 如果答案不止一個,則輸出所有答案並且不考慮順序。 你可以假設總是存在一個答案。
示例 1:
輸入:
[“Shogun”, “Tapioca Express”, “Burger King”, “KFC”]
[“Piatti”, “The Grill at Torrey Pines”, “Hungry Hunter Steakhouse”, “Shogun”]
輸出: [“Shogun”]
解釋: 他們唯一共同喜愛的餐廳是“Shogun”。
示例 2:
輸入:
[“Shogun”, “Tapioca Express”, “Burger King”, “KFC”]
[“KFC”, “Shogun”, “Burger King”]
輸出: [“Shogun”]
解釋: 他們共同喜愛且具有最小索引和的餐廳是“Shogun”,它有最小的索引和1(0+1)。
提示:
兩個列表的長度範圍都在 [1, 1000]內。
兩個列表中的字串的長度將在[1,30]的範圍內。
下標從0開始,到列表的長度減1。
兩個列表都沒有重複的元素。
實現起來比較複雜,但是思路很清晰,所以一遍就通過了
程式碼如下:
class Solution { public String[] findRestaurant(String[] list1, String[] list2) { //考慮使用map來儲存所有的東西,並且第一個表示的是字串,第二個表示的是索引 Map<String, Integer> map = new HashMap<>(); int i = 1; for (String string : list1) { //記錄下字串與其對應的索引 map.put(string, i++); } i = 1; for (String string : list2) { //取出其對應的索引 if(map.get(string) != null){ map.put(string, map.get(string) + i ); } i++; } i = 1; for (String string : list1) { //去除list1中有的但是list2中沒有的字串 if(map.get(string) == i){ map.remove(string); } i ++; } // System.out.println(map.toString()); if(map.size() == 1){ String [] result = new String[1]; for (String string : map.keySet()) { result[0] = string; return result; } }else { int min = Integer.MAX_VALUE; for (String string : map.keySet()) { if(min > map.get(string)){ min = map.get(string); } } List<String> temList = new ArrayList<>(); for (String string : map.keySet()) { if(min == map.get(string)){ temList.add(string); } } String[] arr = (String[])temList.toArray(new String[temList.size()]); return arr; } return new String[-1]; } }
排名靠前的程式碼,很簡單,把我的那個三個for迴圈改成了兩個,不得不說思路很好
class Solution { public String[] findRestaurant(String[] list1, String[] list2) { Map<String, Integer> map = new HashMap<>(); int min = Integer.MAX_VALUE; List<String> resList = new ArrayList<>(); for (int i = 0; i < list1.length; i++) { map.put(list1[i], i); } for (int i = 0; i < list2.length && i <= min; i++) { if (map.containsKey(list2[i])) { int sum = i + map.get(list2[i]); if (sum < min) { resList.clear(); resList.add(list2[i]); min = sum; } else if (sum == min) { resList.add(list2[i]); } } } return resList.toArray(new String[resList.size()]); } }