题目的主要信息:
- 连续输入多次字符串,按照长度为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(1),output长度不会超过8,属于常数空间
方法二:截取输出法
具体做法:
我们对读取到字符串,先检查是否够8位,不够则末尾补0,补完0输出后再读取下一个字符串;如果已经够了8位,我们利用substr函数截取前8位输出,然后更新该字符串,利用substr去掉前8位,再次循环。
#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(1),无额外空间使用