1. 程式人生 > >172、兩個列表的最小索引總和

172、兩個列表的最小索引總和

題目描述
假設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()]);
    }
}