PAT甲级1031 Hello World for U 详细讲解,附测试用例

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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值