老规矩直接根据最直观的方法进行求解,遇到不通过的用例分析存在的问题,AC代码如下:
class Solution {
public:
string compressString(string S) {
int cnt = 1,n = S.size();
if(n <= 2) return S;
string res;
for(int i = 1;i < n;i++)
{
if(S[i] == S[i-1])
{
cnt += 1;
if(i == n-1)
{
res += S[i-1];
res += to_string(cnt);
}
} else if(S[i] != S[i-1]) {
res += S[i-1];
res += to_string(cnt);
cnt = 1;
if(i == n -1) {
res += S[i];
res += to_string(cnt);
}
}
}
return (res.size() < n) ? res:S;
}
};
运行结果:
执行结果:通过
显示详情
执行用时:8 ms, 在所有 C++ 提交中击败了90.48%的用户
内存消耗:7.3 MB, 在所有 C++ 提交中击败了76.01%的用户
代码虽然很挫,但好歹也通过了,阅读性比较差,两个if else中都有判断i是否等于n-1,优化之后的代码:
class Solution {
public:
string compressString(string S) {
int cnt = 1,n = S.size();
if(n <= 2) return S;
string res;
for(int i = 1;i < n;i++)
{
if(S[i] == S[i-1])
{
cnt += 1;
} else if(S[i] != S[i-1]) {
res += S[i-1] + to_string(cnt) ;
cnt = 1;
}
if(i == n-1)
{
res += S[i] + to_string(cnt) ;
}
}
return (res.size() < n) ? res:S;
}
};
优化后的代码看起来清晰不少,运行效率依旧是8ms,击败所有C++提交中的90.48%用户。