题目

结果

代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
| class Solution { public String reorganizeString(String S) { Map<Character, Integer> map = new HashMap<>(); for (int i = 0; i < S.length(); i++) { map.put(S.charAt(i), map.getOrDefault(S.charAt(i), 0) + 1); } if (!reorganizable(map)) { return ""; }
StringBuilder sb = new StringBuilder(); while (sb.length() < S.length()) { var maxes = maxAndSmallMax(map); sb.append(maxes.get(0)); map.put(maxes.get(0), map.get(maxes.get(0)) - 1); if (map.get(maxes.get(0)) == 0) { map.remove(maxes.get(0)); } if (maxes.get(1) != (char) 0) { sb.append(maxes.get(1)); map.put(maxes.get(1), map.get(maxes.get(1)) - 1); if (map.get(maxes.get(1)) == 0) { map.remove(maxes.get(1)); } } } return sb.toString(); }
private List<Character> maxAndSmallMax(Map<Character, Integer> map) { var set = map.keySet(); int max = Integer.MIN_VALUE; char max1 = 0, max2 = 0; for (char ch : set) { if (map.get(ch) > 0 && map.get(ch) > max) { max1 = ch; max = map.get(ch); }
}
if (map.keySet().isEmpty()) { return List.of(max1, (char) 0); } max = Integer.MIN_VALUE; for (char ch : set) { if (ch != max1 && map.get(ch) > max) { max2 = ch; max = map.get(ch); } } return List.of(max1, max2); }
private boolean reorganizable(Map<Character, Integer> map) { var max = map.keySet().stream().max(Comparator.comparingInt(map::get)).orElseThrow(); var val = map.get(max); int sum; sum = map.values().stream().filter(x -> x <= val).mapToInt(x -> x).sum(); return sum - val >= val - 1; } }
|
I have another idea, but I feel sick now.