--- tags: LeetCode --- # 443. String Compression 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. Note: All characters have an ASCII value in [35, 126]. 1 <= len(chars) <= 1000. 輸入範本如下 ```C# public class Solution { public int Compress(char[] chars) { } } ``` ### 直覺想法 ```C# 252 ms 33.3 MB You are here! Your runtime beats 99.08 % of csharp submissions. public int Compress(char[] chars) { int pos = 0; for (int index = 1; index <= chars.Length; index++) { int count = 1; while (index < chars.Length && chars[index] == chars[index - 1]) { count++; index++; } chars[pos++] = chars[index - 1]; // 移動 pos & 將正確的字元捕到正確的位置 if (count > 1) // 數量一個時 , 不用特別標數量 { foreach (var c in count.ToString().ToCharArray()) { chars[pos++] = c; } } } return pos; } ``` ### Thank you! You can find me on - [GitHub](https://github.com/s0920832252) - [Facebook](https://www.facebook.com/fourtune.chen) 若有謬誤 , 煩請告知 , 新手發帖請多包涵 # :100: :muscle: :tada: :sheep: