PAT 甲级 1031 Hello World for U
题目解析:给定某一长度的字符串(所有字符的个数为N),将所有字符按照U字型输出,如helloworld,输出
h d
e l
l r
lowo
这个输出也是有一定规范的,输出的图形越正越好,就是越像正方形越好,所以这就需要一定的算法规则了。
n1表示最左列从上到下字符的个数,n2表示最下行从左到右字符的个数,n3表示最右列从下到上字符的个数。满足条件n1+n2+n3-2=N,左右下角两个字符重合了,所以减掉2。整理得n1+n2+n3=N+2, 题目要求n1=n3,所以n1 n2 n3越接近这个图形越像正方形。
因为n1=n3,所以先确定n2, n2=(N+2)/3,结果要向上取整,再判断(N-n2)%2是否=0,如果不等于0,就得让n2得值加一。现在解释一下这句话,比如给定字符串hellowor,N=8, 8/3向上取整得n2=3, n1=(8-n2)/2=2.5=n3,显然不能是小数,所以n2得自增1,保证n1=n3都为整数。
说到这里相信大家应该都明白是怎么一回事了,20分的题,算是比较简单得。怎么输出代码有注释。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner s=new Scanner(System.in);
String str=s.nextLine();
char[] c=str.toCharArray();
int n2=(int)Math.ceil((c.length+2)*1.0/3);
while((c.length-n2)%2!=0){
n2++;
}
int n1=(c.length-n2)/2;
int n3=n1;
for(int i=0;i<n1;i++){
System.out.print(c[i]); //输出说一下,先输出一个字符,
for(int j=0;j<n2-2;j++){ //输出中间的空格
System.out.print(" ");
}
System.out.print(c[c.length-i-1]);//输出最后一个字符
System.out.println(); //换行
}
for(int i=n1;i<n1+n2;i++){
System.out.print(c[i]); //输出n2范围内的字符,就是最后一行的字符
}
}
}
示例:
hello hellow hellowo hellowor
h o h w h o h r
ell ello e w e o
llo llow
这几个示例通过了,题目给的示例也通过了,一般代码提交都能AC。