Map - [Java]


Map
コンセプト
検索Map形式->値,時間複雑度O(1)
ex) Map map = HashMap<>();
map.put(1, "A");
map.put(2, "B");
map.put(3, "C");
せいけい
  • Map + String(getOrDefault())
  • Map + Array
  • Map + Math.max
  • Map + Set
  • Map + Map
  • Set + Set
  • しゅつりょく
  • map.keySet()
  • for (Integer key : map.keySet()) {
    			System.out.println("key : " + key + " value : " + map.get(key));
    		}
  • map.entrySet()
  • for (Map.Entry<Integer, String> element : map.entrySet()) {
    			System.out.println("key : " + element.getKey() + " value : " + element.getValue());
    		}
  • map.keySet().iterator()
  • Iterator<Integer> keys = map.keySet().iterator();
    		while (keys.hasNext()) {
    			Integer key = keys.next();
    			System.out.println("key : " + key + " value : " + map.get(key));
    		}
    質問する
    1. Map + getOrDefault()
    指定された文字列の最初の重複しない文字を検索し、Indexを返します.
    存在しない場合は-1を返します.
    Input : String s = "inflearninlove"
    Output : 2
    に答える
  • 文字列の各文字数(2文字以上の重複文字)
  • を決定します.
  • 各文字数はMapに
  • 格納される.
  • 文字列の長さで文を回転し、最初に1が現れる文字のインデックス
  • を出力する.
    ソース
    public class Q1 {
    
    	public static void main(String[] args) {
    		String s = "inflearninlove";
    
    		System.out.println(solve(s));
    	}
    
    	public static int solve(String s) {
    
    		if (s == null || s.length() == 0) {
    			return -1;
    		}
    
    		Map<Character, Integer> map = new HashMap<Character, Integer>();
    
    		for (char ch : s.toCharArray()) {
    			// 1
    			map.put(ch, map.getOrDefault(ch, 0) + 1);
    
    			// 2
    //			if (!map.containsKey(ch)) {
    //				map.put(ch, 1);
    //			} else {
    //				map.put(ch, map.get(ch) + 1);
    //			}
    		}
    
    		for (int i = 0; i < s.length(); i++) {
    			if (map.get(s.charAt(i)) == 1) {
    				return i;
    			}
    		}
    
    		return -1;
    	}
    
    }
    2. Map + Array
    自然数を持つ配列を返すときの周波数が最も高いk個の要素
    Input : int[] nums = {1,1,2,2,2,3,5,5,5,5} , int k = 2
    Output : [5, 2]
    に答える
  • map.getOrDefault()を使用して、各数の個数を格納します.
  • 周波数のリスト<>に従って並べ替え、各周波数の対応する数字(キー)を加える.
  • 抽出頻度は
  • kの値です.
  • 周波数リスト)0、1、2、3、4、5、6、7、8、9、10(nums長10)
    value List) null, 1, 2, 3, 4, null, null, null, null, null, null
    key List) null, 3, 1, 2, 5, null, null, null, null, null, null
    ソース
    public class Q2 {
    
    	public static void main(String[] args) {
    		int[] nums = { 1, 1, 2, 2, 2, 2, 3, 5, 5, 5, 5 };
    		int k = 2;
    
    		System.out.println(solve(nums, k));
    	}
    
    	public static List<Integer> solve(int[] nums, int k) {
    		Map<Integer, Integer> map = new HashMap<Integer, Integer>();
    		List<Integer>[] list = new List[nums.length + 1];
    		List<Integer> result = new ArrayList<>();
    
    		for (int num : nums) {
    			map.put(num, map.getOrDefault(num, 0) + 1);
    		}
    
    		for (int key : map.keySet()) {
    			int topFreq = map.get(key);
    			if (list[topFreq] == null) {
    				list[topFreq] = new ArrayList<Integer>();
    			}
    			list[topFreq].add(key);
    
    		}
    
    		for (int lastIndex = list.length - 1; lastIndex >= 0; lastIndex--) {
    			if (list[lastIndex] != null) {
    				// System.out.println(list[lastIndex]);
    				for (int i = 0; i < list[lastIndex].size() && result.size() < k; i++) {
    					result.add(list[lastIndex].get(i));
    				}
    			}
    		}
    
    		return result;
    	}
    
    }
    リファレンス인프런 강의 : 코딩테스트 전 꼭 알아야 할 개념과 문제(with 자바) - 푸샵맨 코딩스터디