题目

结果

代码
| 12
 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.