题目
给定一个字符数组chars,请使用下述算法压缩:
1.如果这个字符长度位1,直接返回
2.否则以字符+个数的形式
压缩后得到的字符出不直接返回,需要直接转储到字符数组chars中,返回该数组的新长度。
举例:
输入:chars=[‘a’,‘b’,‘b’,‘b’,‘b’,‘b’,‘b’,‘b’,‘b’,‘b’,‘b’,‘b’,'b];
输出:返回 4. 输入数组chars=[‘a’,‘b’,‘1’,‘2’];
其中b有12个,但是以字符 1 和字符 2的形式存储。
1<=chars.length<=2000
chars[i]可以是小写英文字母、大写英文字母、数字或符号
解题思路
1.直接统计字符的个数
2.个数如果 >=9,需要先变成一个一个的数值,再转过来以字符的形式表示
具体代码
int compress(char* chars, int charsSize) {
int i = 0;
// char arr[2001];
int num = 0;
while (i < charsSize) {
char c = chars[i];
int count = 1;
int k;
if (i + 1 < charsSize) {
k = i + 1;
while (k < charsSize && chars[k] == c) {
k++;
count++;
}
chars[num++] = c;
// printf("count=%d\n", count);
if (count == 1) {
}
else {
if (count <= 9) {
chars[num++] = count + '0';
}
else {
int x = 0;
int t[33];
while (count != 0) {
t[x++] = count % 10;
count /= 10;
}
for (int y = x-1; y>=0; y--) {
chars[num++] = t[y] + '0';
}
}
}
i = k;
}
else {
chars[num++] = c;
i++;
}
}
//for (int z = 0; z < num; z++) {
// printf("%c ", chars[z]);
//}
//printf("\n");
return num;
}
全部代码
// yasuostring.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <stdio.h>
int compress(char* chars, int charsSize) {
int i = 0;
// char arr[2001];
int num = 0;
while (i < charsSize) {
char c = chars[i];
int count = 1;
int k;
if (i + 1 < charsSize) {
k = i + 1;
while (k < charsSize && chars[k] == c) {
k++;
count++;
}
chars[num++] = c;
// printf("count=%d\n", count);
if (count == 1) {
}
else {
if (count <= 9) {
chars[num++] = count + '0';
}
else {
int x = 0;
int t[33];
while (count != 0) {
t[x++] = count % 10;
count /= 10;
}
for (int y = x-1; y>=0; y--) {
chars[num++] = t[y] + '0';
}
}
}
i = k;
}
else {
chars[num++] = c;
i++;
}
}
for (int z = 0; z < num; z++) {
printf("%c ", chars[z]);
}
printf("\n");
return num;
}
int main()
{
char chars[13] = {
'a','b','b','b','b','b','b','b','b','b','b','b','b' };
compress(chars, 13);
return 0;
}
调试
在调试代码的过程中碰到问题:
heap-buffer-overflow on address~~~
一般是数据上下溢出,最后发现是在统计字符个数的时候,写成了:
while ( chars[k] == c&&k<charsSize)
这样的话,k=charsSize,就会导致chars溢出了。
应该改成
while (k < charsSize && chars[k] == c)
记录下一个代码经验,有判断的时候,下标判断要写在前面。
写在最后的话
写代码,真的只能一步一步的敲,日积月累~~ 希望自己的代码能力在一段时间之后,可以提高~~~~