[双指针] [读写指针][ 字符串/数据 压缩] 443. 压缩字符串
昨天面试,第一道题A的太快,结果面试官直接说这么快呀,那么来第二道。。。。。。。。。
A太快也是错。
不过这道题也A的很快。幸亏没说 再来一道
说回正题,此题的方法采用的 是帆哥的代码。我只是在他的代码上加以我的理解注释
主要思想:
- 读指针在前面读,记录读指针开始的位置,然后记录他们之间的距离。也就是重复字符的个数
- 写指针在后面写,写的时候还要注意,如果大于10,那么肯定取个位来获取全部的数值。那么就写反了,比如13,就写成了31
- 因此需要在翻转一下。
- 题目思想是比较简单的。
- 但是要注意一下细节问题。
class Solution {
public int compress(char[] chars) {
int write= 0;
int read = 0 ;
int len = chars.length;
while(read<len)
{
int readStart = read;
// 写指针往前走,一直走到不重复的字符为止
while(read+1<len&&chars[read+1]==chars[read])
{
read++;
}
// ... [readStart... read]...
// 前面读后面写。 也就是说,aaa . a是3个,应该携程a3 ,但是写需要先写a,
// 然后记录到底几个a,接下来的操作就是计算到底几个a
chars[write++] = chars[readStart];
// 如果相等,就说只有这一个字符,一个字符不用记录数量的
if(readStart!=read)
{
// 记录开始点以及结束点 之间的距离
int count = read - readStart+1;
// 写指针开始点,写指针结束点,比如 写 a: 123
// 1所在的位置就是开始点,3就是结束点。
int writeStart = write;
while(count!=0)
{
// 因为如果a是13个,那么我需要先写1 ,在写3,但是我需要把整形转换为字符
// 因此需要这样做;
chars[write++] = (char)(count%10+'0');
count/=10;
}
//为什么需要这个? 因为我是13,我13写的时候先得到个位,然后得到十位,
//写的时候就是写成了 31, 但是数据次数是13,因此需要把31重新翻转为13.
reverse(chars,writeStart,write-1);
}
// a:13 写完了,需要写b了。
read++;
}
return write;
}
public void reverse(char[] chars,int start,int end)
{
while(start<end)
{
char temp = chars[start];
chars[start]= chars[end];
chars[end] =temp;
start++;
end--;
}
}
}