Given an array of characters, compress it in-place.
The length after compression must always be smaller than or equal to the original array.
Every element of the array should be a character (not int) of length 1.
After you are done modifying the input array in-place, return the new length of the array.
Follow up:
Could you solve it using only O(1) extra space?
Example 1:
Input: ["a","a","b","b","c","c","c"] Output: Return 6, and the first 6 characters of the input array should be: ["a","2","b","2","c","3"] Explanation: "aa" is replaced by "a2". "bb" is replaced by "b2". "ccc" is replaced by "c3".
Example 2:
Input: ["a"] Output: Return 1, and the first 1 characters of the input array should be: ["a"] Explanation: Nothing is replaced.
Example 3:
Input: ["a","b","b","b","b","b","b","b","b","b","b","b","b"] Output: Return 4, and the first 4 characters of the input array should be: ["a","b","1","2"]. Explanation: Since the character "a" does not repeat, it is not compressed. "bbbbbbbbbbbb" is replaced by "b12". Notice each digit has it's own entry in the array. 注意程序的输入边界:All characters have an ASCII value in [35, 126] 和 1 <= len(chars) <= 1000
结题思路参考38. Count and Say
传送门:https://mp.csdn.net/postedit/87939397
public class StringCompress { public static int compress(char[] chars) { if(chars == null || chars.length == 0) return -1; if(chars.length == 1) return 1; int len = chars.length; //双指针 int i = 0; int j = 1; //一个数字连续出现的次数,至少出现一次 int charCnt = 1; //标识下一个可写入的位置,若移动i时,charCnt为1,则index++,否则,index+2 int index = 0; while(i < j && j < len) { if(j == len - 1) { if(chars[i] == chars[j]) { charCnt++; chars[index++] = chars[i]; if(charCnt > 1) { char[] nums = splitCnt(charCnt); int charIndex = 0; while(nums[charIndex] != 0) { chars[index] = nums[charIndex]; index++; charIndex++; } } break; } else { chars[index++] = chars[i]; if(charCnt > 1) { char[] nums = splitCnt(charCnt); int charIndex = 0; while(nums[charIndex] != 0) { chars[index] = nums[charIndex]; index++; charIndex++; } } chars[index++] = chars[j]; break; } } if(chars[i] == chars[j]) { //i不动,j移动 j++; charCnt++; } else { if(charCnt == 1) { chars[index++] = chars[i]; } else { chars[index++] = chars[i]; char[] nums = splitCnt(charCnt); int charIndex = 0; while(nums[charIndex] != 0) { chars[index] = nums[charIndex]; index++; charIndex++; } } charCnt = 1; //步子迈的有点大 i = j; j++; } } return index; } /** * 将一个整数分为字符串 * 如123 =》 ['1','2','3'] * @param cnt * @return */ private static char[] splitCnt(int cnt) { char[] chars = new char[4]; int i = 3; while(cnt >= 10){ chars[i] = (char)( cnt % 10 + 48); i--; cnt = cnt / 10; } if(i >= 0) { chars[i] = (char)(cnt + 48); } if(i == 0) return chars; if(i == 1) { chars[0] = chars[1]; chars[1] = chars[2]; chars[2] = chars[3]; chars[3] = 0; return chars; } if(i == 2) { chars[0] = chars[2]; chars[1] = chars[3]; chars[2] = 0; chars[3] = 0; return chars; } chars[0] = chars[3]; chars[1] = 0; chars[2] = 0; chars[3] = 0; return chars; } public static void main(String[] args) { char[] chars = {'a','a','a','a','a','a','a','a','a','a'}; System.out.println(StringCompress.compress(chars)); // char[] chars = StringCompress.splitCnt(1234); // System.out.println(); // System.out.println(""); // System.out.println(""); } }