目录
牛客_NC101压缩字符串(一)_模拟
压缩字符串(一)_牛客题霸_牛客网 (nowcoder.com)
描述:
利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能。比如,字符串aabcccccaaa会变为a2bc5a3。
- 如果只有一个字符,1不用写
- 字符串中只包含大小写英文字母(a至z)。
数据范围:
0<=字符串长度<=50000
要求:
时间复杂度O(N)
题目解析
利用双指针模拟即可,只需用一个cnt记录上一个字符出现的次数即可,如果cnt=1则直接向结果追加字母,不加数字,如果cnt>1才追加出现的次数。注意9以上的数字不能直接+'0'转成字符,要to_string。
C++代码
#include <string>
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param param string字符串
* @return string字符串
*/
string compressString(string param) {
int left = 0, right = 1, sz = param.size();
string ret;
while (right < sz)
{
int cnt = 1;
while (param[left] == param[right])
{
++cnt;
++right;
}
ret += param[left];
if (cnt != 1)
ret += to_string(cnt);
// ret += cnt + '0'; // !!!!!!!!!!!!
left = right;
++right;
}
if (left == sz - 1)
ret += param[left];
// cout << left << " " << right << " " << sz << endl;
return ret;
}
};
Java代码
import java.util.*;
public class Solution
{
public String compressString (String param)
{
StringBuffer ret = new StringBuffer();
char[] s = param.toCharArray();
int left = 0, right = 0, n = s.length;
while(left < n)
{
while(right + 1 < n && s[right + 1] == s[right]) right++;
int len = right - left + 1;
ret.append(s[left]);
if(len > 1)
{
ret.append(len);
}
left = right + 1;
right = left;
}
return ret.toString();
}
}
标签:cnt,right,Java,OJ,param,ret,C++,string,left
From: https://blog.csdn.net/GRrtx/article/details/142873047