1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| class Solution { public int compress(char[] chars) { int pos = 0; int docPtr = 0; while (pos < chars.length) { char currChar = chars[pos]; int length = 1; pos += 1; while (pos < chars.length && chars[pos] == chars[pos - 1]) { length += 1; pos += 1; } chars[docPtr++] = currChar; if (length != 1) { for (char digit : String.valueOf(length).toCharArray()) { chars[docPtr++] = digit; } } } return docPtr; } }
|
很简单. 一个ptr去找, 一个ptr去记录结果.
时间复杂度: O(n) 因为toCharArray这一步相比遍历整个string需要的时间小很多, 因此可以忽略.
空间复杂度: O(n) toCharArray这一步需要创建一个length的char array, 但我感觉也是很短,
可以忽略.
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
| class Solution { public int compress(char[] chars) { int pos = 0; int docPtr = 0; while (pos < chars.length) { char currChar = chars[pos++]; int length = 1; while (pos < chars.length && chars[pos] == chars[pos - 1]) { length += 1; pos += 1; } chars[docPtr++] = currChar; if (length != 1) { int left = docPtr; while (length != 0) { int currDigit = length % 10; chars[docPtr] = (char) (currDigit + '0'); length /= 10; docPtr += 1; } reverse(chars, left, docPtr - 1); } } return docPtr; }
private void reverse(char[] chars, int left, int right) { while (left < right) { char temp = chars[left]; chars[left] = chars[right]; chars[right] = temp; left += 1; right -= 1; } } }
|
这个是不用创建charArray, 同时String.valueOf()的时间复杂度也会和被examined的integer的长度相关. 因此我们就用很古老的除以10来获取length的每一个digit, 但是这样获取的是倒序的, 因此我们获取完还要reverse一下.
时间复杂度: O(n)
空间复杂度: O(1)