当前位置: 首页 > 知识库问答 >
问题:

算法 - PAT 1078 字符串压缩与解压,第五个测试点过不去?

冯曾笑
2024-03-06

题目传送门:https://pintia.cn/problem-sets/994805260223102976/exam/proble...

第五个测试点过不去,不知道什么问题:image.png

#include<bits/stdc++.h>using namespace std;//压缩void fun1(string s){    int cnt = 1; //算上自身所以是1    string ss;    //首先看一下相同的字母就count++;,这样count就存储了要压缩的字母的个数    for (int i = 0; i < s.size(); i++)    {        if (s[i] == s[i + 1])cnt++;        else        {            if (cnt == 1)ss += s[i];  //只有一个字符的话不要把数字加上,即1s,而是直接加s,即 s           else ss += to_string(cnt) + s[i]; //要压缩的字母个数+字母           cnt = 1;  //重置         }    }    cout << ss<<endl;    }//解压void fun2(string s){    int index = 0;    string ss;    //解压的话我们需要看数字以及数字后面的字符    while (index < s.size())    {              if(isdigit(s[index])&&isdigit(s[index+1]))        {            int temp= (s[index] - '0') * 10 + (s[index + 1] - '0');            while (temp--)            {                if(index+2<s.size())                ss += s[index + 2];            }            index += 3;        }         else if (isdigit(s[index]))         {             int temp = s[index] - '0';             while (temp--)             {                 if(index+1<s.size())                 ss += s[index + 1];             }             index += 2;         }       else //字母         {           if(index<s.size())           {            ss += s[index];            index++;           }        }          }    cout << ss<<endl;}int main(){    char c; cin >> c; getchar();    string s; getline(cin, s);    if (c == 'C')        fun1(s);    else if (c == 'D')        fun2(s);    return 0;}

修正代码

共有1个答案

扈德容
2024-03-06

首先,我们需要明确题目的要求。根据提供的链接,这是一个字符串压缩与解压的问题。压缩时,连续的相同字符会被替换为字符及其连续出现的次数;解压时,需要还原回原始字符串。

现在,我们来看你的代码。

  1. 压缩函数 (fun1)
* 你在循环中使用了 `s[i + 1]`,这可能会导致数组越界,因为当 `i` 是最后一个字符时,`s[i + 1]` 是未定义的。* 你的代码逻辑在处理只有一个字符的连续序列时存在问题。当只有一个字符时,你不应该增加 `cnt`,而应该直接添加到结果字符串中。
  1. 解压函数 (fun2)
* 你的代码在处理数字时存在问题。例如,对于输入 "3a4b",你的代码会错误地处理为 "aaabbbb",而不是正确的 "aaaabbbb"。* 你在处理数字时,没有考虑到数字可能超过两位数的情况。

下面是修正后的代码:

#include<bits/stdc++.h>using namespace std;void fun1(string s) {    string ss;    int cnt = 1;    for (int i = 1; i <= s.size(); i++) {        if (i < s.size() && s[i] == s[i - 1]) {            cnt++;        } else {            if (cnt > 1) ss += to_string(cnt);            ss += s[i - 1];            cnt = 1;        }    }    cout << ss << endl;}void fun2(string s) {    string ss;    int num = 0, i = 0;    while (i < s.size()) {        if (isdigit(s[i])) {            num = num * 10 + (s[i] - '0');            i++;        } else {            while (num--) ss += s[i];            num = 0;            i++;        }    }    cout << ss << endl;}int main() {    char c; cin >> c; getchar();    string s; getline(cin, s);    if (c == 'C') fun1(s);    else if (c == 'D') fun2(s);    return 0;}

这个修正的代码应该能解决你的问题,并通过第五个测试点。

 类似资料:
  • 本文向大家介绍php压缩和解压缩字符串的方法,包括了php压缩和解压缩字符串的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了php压缩和解压缩字符串的方法。分享给大家供大家参考。具体如下: 下面php代码通过gzcompress和gzuncompress压缩和解压缩字符串,可以设定压缩级别 希望本文所述对大家的php程序设计有所帮助。

  • 本文向大家介绍C#自定义字符串压缩和解压缩的方法,包括了C#自定义字符串压缩和解压缩的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#自定义字符串压缩和解压缩的方法。分享给大家供大家参考。具体如下: 代码使用方法: 希望本文所述对大家的C#程序设计有所帮助。

  • 问题内容: 我在想办法也无法在Java中解压缩String时遇到麻烦。这是我要学习的基本Java类,因此只需要基本命令,没有什么花哨的地方。它能够输入的目标 在命令提示符下,它将打印(就像它压缩参数字符串一样)。 另一个目标是输入 它将打印(就像它将解压缩参数String一样)。减压是我遇到的问题。这是我的代码,非常感谢我得到的任何帮助。 问题答案: Quick Code for you..

  • 问题内容: 我正在使用以下代码来压缩和解压缩字符串数据,但是我面临的问题是,它很容易被压缩而不会出错,但是decompress方法会引发以下错误。 线程“主”中的异常java.io.IOException:不是GZIP格式 仍然不知道如何解决此问题!!! 问题答案: 这是因为 发送您可以从中获得的,并在其中使用它来构建您的。以下是需要在代码中进行的更改。

  • 问题内容: python docs将此代码作为zip的反向操作: 特别是 zip()与*运算符一起可用于解压缩列表。 有人可以向我解释运算符在这种情况下如何工作吗?据我了解,是一个二进制运算符,可以用于乘法或浅表复制…在这里似乎都不是这样。 问题答案: 像这样使用时,*(星号,在某些情况下也称为“ splat”运算符)是从列表中解压缩参数的信号。有关示例的更完整定义,请参见http://docs.

  • 本文向大家介绍python用模块zlib压缩与解压字符串和文件的方法,包括了python用模块zlib压缩与解压字符串和文件的方法的使用技巧和注意事项,需要的朋友参考一下 python中zlib模块是用来压缩或者解压缩数据,以便保存和传输。它是其他压缩工具的基础。下面来一起看看python用模块zlib压缩与解压字符串和文件的方法。话不多说,直接来看示例代码。 例子1:压缩与解压字符串 结果 例子