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?
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++
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class Solution { | |
public: | |
int compress(vector<char>& chars) { | |
const int len = chars.size(); | |
const int limit = len - 1; | |
int writeIdx = 0, anchorIdx = 0; | |
string str; | |
for(int readIdx = 0; readIdx < len; readIdx++) { | |
if(readIdx == limit || chars[readIdx] != chars[readIdx + 1]) { | |
chars[writeIdx++] = chars[anchorIdx]; | |
if(readIdx > anchorIdx) { | |
str = to_string(readIdx - anchorIdx + 1); | |
for(const auto c : str) { | |
chars[writeIdx++] = c; | |
} | |
} | |
anchorIdx = readIdx+1; | |
} | |
} | |
return writeIdx; | |
} | |
}; |
Java
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class Solution { | |
public int compress(char[] chars) { | |
final int limit = chars.length - 1; | |
int writeIdx = 0, anchorIdx = 0; | |
for(int readIdx = 0; readIdx < chars.length; readIdx++) { | |
if(readIdx == limit || chars[readIdx] != chars[readIdx + 1]) { | |
chars[writeIdx++] = chars[anchorIdx]; | |
if(readIdx > anchorIdx) { | |
for(char c : ("" + (readIdx - anchorIdx + 1)).toCharArray()) { | |
chars[writeIdx++] = c; | |
} | |
} | |
anchorIdx = readIdx + 1; | |
} | |
} | |
return writeIdx; | |
} | |
} |
沒有留言:
張貼留言