compress(s): if s == null: throw "null" start = end = 0 buffer = new while start < s.length(): while end < s.length() && s[end] == s[start]: end++ count = end - start buffer.append(s[start] + count) start = end return buffer.length() >= s.length() ? s : buffer.tostring()[Hat tip to SE]
Few optimizations:
- If s has digits, return itself.
- If buffer's length equals or exceeds s' length, break.
- Append count only if 2+.
compress(s): if s == null: throw "null" for i = 0, i < s.length(), i++: if 0 <= (s[i] - '0') <= 9: return s start = end = 0 buffer = new while start < s.length(): while end < s.length() && s[end] == s[start]: end++ count = end - start buffer.append(s[start]) if count > 1: buffer.append(count) if buffer.length() >= s.length(): break start = end return buffer.length() < s.length() ? buffer.tostring() : sDecompress.
decompress(s): if s == null: throw buffer = new i = 0 while i < s.length(): c = s[i] dstart = dend = i+1 while dend < s.length() && 0 <= (s[dend]-'0') <= 9: dend++ count = max(1, count(s, dstart, dend)) buffer.append(repeat(c, count)) i = dend return buffer.tostring() count(s, start, end): if start >= end || start >= s.length() || end > s.length(): return 0 return int.parse(s.substring(start, end-start)) repeat(c, count): buffer = new (capacity: count) for i = 0, i < count, i++: buffer.append(c) return buffer.tostring()
No comments:
Post a Comment