题目的主要信息:

  • 连续输入多次字符串,按照长度为8拆分每个字符串并输出
  • 长度不是8的整数倍的字符串需要在末尾补0,空字符不处理

方法一:遍历添加法

具体做法:

我们利用while和cin连续读取字符串,对于每个读取的字符串,我们遍历其每一个字符,将遍历到的字符添加到临时变量output中,其中每8次要将output输出然后清空。遍历结束以后,我们要检查output中还有无剩余的字符,如果没有说明这个字符串刚好是8的倍数,我们跳过,否则我们需要在output末尾补0,直到output长度为8,才能输出。

#include<iostream>
#include<string>
using namespace std;

int main(){
    string s = "";
    while(cin >> s){ //连续读取字符串
        string output = "";
        for(int i = 0; i < s.length(); i++){ //遍历刚刚读取的字符串的每个字符
            output += s[i]; //添加字符
            if((i + 1) % 8 == 0){ //每到8个字符输出一次
                cout << output << endl;
                output = ""; //清空待输出的字符串
            }
        }
        if(output == "") //空字符不输出
            continue;
        for(int i = output.length(); i < 8; i++) //最后不够8的添加0后输出
            output += '0';
        cout << output << endl;
    }
    return 0;
}

复杂度分析:

  • 时间复杂度:O(n)O(n)O(n),遍历字符串的每个字符
  • 空间复杂度:O(1)O(1)O(1),output长度不会超过8,属于常数空间

方法二:截取输出法

具体做法:

我们对读取到字符串,先检查是否够8位,不够则末尾补0,补完0输出后再读取下一个字符串;如果已经够了8位,我们利用substr函数截取前8位输出,然后更新该字符串,利用substr去掉前8位,再次循环。

alt

#include<iostream>
#include<string>
using namespace std;

int main(){
    string s = "";
    getline(cin, s);
    while(true){
        int n = s.size();
        if(n <= 8){ //不够8,填充0
            s.insert(s.end(), 8 - n, '0');
            cout << s << endl;
            if (!getline(cin, s)) //读取下一个字符串
                break; //没有跳出循环
        }else{
            cout << s.substr(0, 8) << endl; //截取输出
            s = s.substr(8, n - 8); //去掉前面8位
        }
    }
    return 0;
}

复杂度分析:

  • 时间复杂度:O(n)O(n)O(n),相当于遍历字符串每个字符
  • 空间复杂度:O(1)O(1)O(1),无额外空间使用