复试机试帖1-3 暴力帖模拟延续
-
例题简述
给你一段字符串,把它拼成U型。用例测试见下图,要求是,U型底部(包括左下角和右下角)长度大于等于3,同时大于u型两侧(带左下角和右下角),举例就是lowor长度大于hell。在这个前提得基础上,两侧长度越大越好。
题目解析:核心是求出两侧长度,然后底部长度就有了,然后按照字符串的顺序依次放进数组就行了。其余地方设置为0就行了,到时候看见0就输出空格,就能达到题目要求。
设两侧长度均为x(不带左下角和右下角),设字符串长度为N,则U型底部长度(含左右下角)长度就是N-2*x。x弄一个for循环,从1到N,里面套一个if条件 判断两侧长度是否都小于底部长度,以及底部长度是否是大于3。如果都满足的话,把两侧长度保存。从1 到N,到最后会把满足条件最大的长度给保存。
代码如下:
#include<iostream>
using namespace std;
int main(){
char a[80]={0};
char judge=0;
while(cin>>judge){
int order=1;
char input=0;
a[1]=judge;
while((input=cin.get())!='\n'){
a[order+1]=input;
order++;
}
char b[11][11]={0};
int height=0;
int width=0;
for(int i=1;i<=order-1;i=i+1){
if(i+1<=(order-2*i)){
height=i;
width=order-2*i;
}
}
int p=1;
for(int i=1;i<=height;i=i+1)
b[i][1]=a[p++];
for(int i=1;i<=width;i=i+1)
b[height+1][i]=a[p++];
for(int i=height;i>=1;i=i-1)
b[i][width]=a[p++];
for(int i=1;i<=height+1;i=i+1)
{
for(int j=1;j<=width;j=j+1)
{
if(b[i][j]!=0) {
cout<<b[i][j];
}
else{
cout<<" ";
}
}
cout<<endl;
}
}
}
问题:野生的复杂怪出来了。按照我传统思想,但凡这种要输出图形的我都要搞一个数组把它放进去。而且关键是,题目是给的一个长字符串。这种情况下,添加两个string相关的头文件。就完全不需要用char数组了。
看了别人的思路,改进的string解题方法:
#include<iostream>
#include<string>
#include<string.h>
using namespace std;
int main(){
string s;
while(cin>>s){
int len=s.length();
int x=0;
for(x=len;x>=1;x=x-1){
if(x<=(len-2*x+2)&&(len-2*x+2)>=3)
break;
}
int first=1;
int final=len;
for(int i=1;i<=x-1;i=i+1){
cout<<s[i-1];
for(int j=1;j<=len-2*x;j=j+1)
cout<<" ";
cout<<s[final-i]<<endl;
}
for(int t=1;t<=len-2*x+2;t=t+1)
cout<<s[x-2+t];
cout<<endl;
}
}
舒服了,string还是用起来方便。而且这里也不需要设立一个数组。
唯一一个比较难想出来的地方就是如何同时把每一行的两个数加上间隔的空格,一次性输出。
我的想法,分三步:①输出字符串最前面的字符②for循环输出底部长度-2的空格③输出字符串最后面的字符然后换行
把字符串第一个和最后一个字符去掉,然后重复上述三步,最终实现不借助数组完成图形的输出。
不过我这样思路打不开的可能还是偏向于第一种思路。第二种方法需要你记住string的头文件