443.string-compression.go 596 B

123456789101112131415161718192021222324252627282930
  1. func compress(chars []byte) int {
  2. fast, slow, cnt, n := 1, 0, 1, len(chars)
  3. if n <= 1 {
  4. return n
  5. }
  6. for ; fast < n; fast++ {
  7. if chars[fast] != chars[fast-1] {
  8. chars[slow] = chars[fast-1]
  9. slow++
  10. if cnt != 1 {
  11. num := strconv.Itoa(cnt)
  12. for end, i := slow+len(num), 0; slow < end; slow, i = slow+1, i+1 {
  13. chars[slow] = num[i]
  14. }
  15. cnt = 1
  16. }
  17. } else {
  18. cnt++
  19. }
  20. }
  21. chars[slow] = chars[fast-1]
  22. slow++
  23. if cnt != 1 {
  24. num := strconv.Itoa(cnt)
  25. for end, i := slow+len(num), 0; slow < end; slow, i = slow+1, i+1 {
  26. chars[slow] = num[i]
  27. }
  28. }
  29. return slow
  30. }