443. String Compression
Easy
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.
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
这个题想了很久没想出来,网上有个做法是input为string s的同一道题,我本来想先把char array转换成string直接按着那个方法做,但是这道题要求的是in place解,就是必须直接在原来的array上改动,不能新增array或者转成string去做。
这道题用三个指针,i,j表示的是移动的两个pointers, 用来“包住”相同的字符串的部分;k用来写找index写入char[] chars。比如[a,a,b,b,b,c,c,c,c]这个input. 一开始i = j = k = 0, 然后j会一直右移到j = 2. 这个时候我们用k找到该写入的地方,先是写入a再右移k, char[k++] = char[i]; 然后我们检查是否j - i >= 2,如果是就说明同一个char有重复的,这个时候我们就要把重复的次数写到chars里面去。这里用的技巧比较难想到,先是把j - i这个int转换成string,然后再把string转成char array, 再把每一个array元素写到chars里面去。最后我们将i移动到j的位置,继续while loop. 最后的k刚好落到chars最后一个元素后一个index,就是我们元素的个数。
class Solution {
public int compress(char[] chars) {
int n = chars.length;
int i = 0, j = 0, k = 0;
while (i < n){
while (j < n && chars[i] == chars[j]){
j++;
}
chars[k++] = chars[i];
if (j - i >= 2){
for (char c : String.valueOf(j - i).toCharArray()){
chars[k++] = c;
}
}
i = j;
}
return k;
}
}
推荐阅读
-
编写一个函数reverse_string(char * string)(递归实现)实现:将参数字符串中的字符反向排列。 要求:不能使用C函数库中的字符串操作函数
-
一个PHP的String类代码_php技巧
-
mybatis in查询传入String方式
-
C#学习日记15----引用类型 之 string类型用法总结
-
js String.prototype.trim字符去前后空格的扩展
-
[HOOLOO] zizaco/entrust 5.2.x-dev Class name must be a valid object or a string,hooloozizaco
-
PHP STRING 陷阱原理说明_php技巧
-
【C++深度剖析教程15】经典问题解析之关于string的疑问
-
PHP STRING 陷阱原理说明_PHP教程
-
JS基础语法---String对象