Transformez la chaîne aaaabbbbddd en a4b4d3

J’essaie de prendre une longueur d’avance sur les questions d’entrevue et je suis tombé sur celle-ci:

Transformez la chaîne aaaabbbbddd en a4b4d3

Vous voudriez essentiellement convertir la chaîne existante en une chaîne avec chaque occurrence de caractère unique et le nombre d’occurrences de ce caractère.

C’est ma solution, mais je pense qu’elle pourrait être raffinée pour offrir quelque chose de plus élégant:

Ssortingng s = "aaaabbbbddd"; Ssortingng modified = ""; int len = s.length(); char[] c = s.toCharArray(); int count = 0; for (int i = 0; i < len; i++) { count = 1; for (int j = i + 1; j < len; j++) { if (c[i] == ' ') { break; } if (c[i] == c[j]) { count++; c[j] = ' '; } } if (c[i] != ' ') { modified += c[i] + "" + count; } } System.out.println(modified); 

Quelqu’un a-t-il d’autres suggestions de solution?

Utilisez plutôt un mappage Map . Essayez d’insérer le nouveau caractère dans la carte. s’il existe déjà, incrémentez la valeur de ce caractère particulier.

Exemple:

 Map countMap = new HashMap<>(); if(!countMap.containsKey('a')) { countMap.put('a', 1); } else { countMap.put('a', countMap.get('a') + 1); } 

Pour append à la réponse merveilleuse de @ Makoto, dans votre cas, j’utiliserais un TreeMap au lieu d’un HashMap . Une TreeMap vous permettra d’imprimer par ordre alphabétique. J’ai également ajouté le code d’impression pour vous montrer à quoi il ressemblerait. C’est complètement exécutable.

 import java.util.Map; import java.util.TreeMap; public class MapPractice { public static void main(Ssortingng[] args) { Map map = new TreeMap<>(); String blah = "aaaabbbbddd"; for (int i = 0; i < blah.length(); i++) { char c = blah.charAt(i); if (!map.containsKey(c)) { map.put(c, 1); } else { map.put(c, (map.get(c) + 1)); } } for (Map.Entry entry: map.entrySet()) { System.out.print(entry.getKey() + "" + entry.getValue()); } } } 

Sortie avec TreeMap : a4b4d3

Sortie avec HashMap : d3b4a4

Ma version

  SsortingngBuilder sb = new SsortingngBuilder(); int count = 0; char last = s.charAt(0); for(char c : s.toCharArray()) { if (c == last) { count++; } else { sb.append(last).append(count); count = 0; last = c; } } if (count != 0) { sb.append(last).append(count); } System.out.println(sb); 

Voici le code que j’ai essayé.

Je pense que vous ne pouvez pas demander un code plus simple que cela.

  Ssortingng s = "aaaabbbbddd", modified = ""; int len = s.length(), i = 0, j = i + 1, count = 1; char[] c = s.toCharArray(); for (; i < len; i = j) { count = 1; for (; j < len; j++) if (c[i] == c[j]) count++; else { j++; break; } modified += c[i] + "" + count; } System.out.println(modified); 

Voici ma solution

 public Ssortingng countChars(Ssortingng in){ LinkedHashMapMap map = new LinkedHashMap(); for(char c: in.toCharArray()){ Integer count = map.get(c); if(count==null){ count=0; } count++; map.put(c,count); } Ssortingng out =""; for(Entry e : map.entrySet()){ out += e.getKey()+e.getValue(); } return out; }