拍照队形个人思路解析-牛客算法题

题目链接:https://www.nowcoder.com/questionTerminal/1b1f87ef6e7d40529d82c96aef79e8a4

猿辅导公司的 N位(N>=4)研发同学组织了一次秋游活动,某同学带了个无人机在高空拍照,活动结束时,先拍了一张所有同学排成公司猴头Logo的照片, 接着有人提议再排成“猿”的首字母Y字形来拍一张合照。
用字符串中的每一个字符(不是换行符或结束符’\0’)代表一位老师,输出排好后的队形。要求 Y字除去中心点外,上下半部分等高,按照从左到右,从上到下进行排序。队形中没人的部分用空格占位。
输入数据保证可以排出一个完整的Y字,即长度为 3k+1 (k>=1)
例如: 7个 x ,排成队形为(为了方便说明,这里用‘-’代替空格):
x—x
-x-x
–x
–x
–x
输入描述:
输入数据有两行,第一行输入N(N<=1000),表示字符串长度。
第二行输入字符串。

输出描述:
用字符串表示的排好的队形,没人处用空格(' ')占位,行尾不能有多余字符,即每行最后一个字符(除了换行符以外),为字符串中代表该老师的字符。
示例1

输入

4
a3f/

输出

a 3
 f
 /
示例2

输入

7
abcdefg

输出

a   b
 c d
  e
  f
  g
示例3

输入

10
iiiiiiiiii

输出

i     i
 i   i
  i i
   i
   i
   i
   i

我自己写的思路答案-链接

/*
     * 这个题我是这么想的
     * 要想组成Y,输入的数必须符合3k+1 (k>=1)
     * 下面咱们总结一下,假设用户输入的为num变量,简化用户输入的都为i,空格用-代替
     * 所以当num=4的时候,也就是k=1。
     * 是这样的
     *    i-i
     *     i
     * 当num=7的时候,也就是k=2。
     * i---i
     * -i-i
     * --i
     * --i
     * --i
     * 当num=10的时候,也就是k=3。
     * i-----i
     * -i---i
     * --i-i
     * ---i
     * ---i
     * ---i
     * ---i
     * 等等
     * 我们可以从这三个就可以看出,大家注意其实可以从单行一个字母把Y分为两个部分
     * 比如k=1时,可以把1-1行Y分为上半部分
     * 比如k=2时,可以把1-2行Y分为上半部分
     * 比如k=3时,可以把1-3行Y分为上半部分
     * 所以发现特点没,k的值就是标志Y的两个部分的分界线
     * 然后我们要做的就是分两个部分进行打印,上半部分(行数=k)和下半部分(行数=k+1)
     * 我们首先看上半部分:
     * 上半部分的输出其实就是首先是每一行的第一个i前面输出a个空格,再输出i,然后中间去输出b个空格,再输出i
     * 关键就是我们去确定a和b
     * 大家可以看上面的找出规律,每一行每一行的第一个i前面输出a个空格的,a=2*(k-i)-1(i为当前每行的行数,从0开始)
     * 中间去输出b个空格,这个b=2*(k-i)-1(i为当前每行的行数,从0开始)
     * 然后就照着这个进行循环打印上半部分
     * 下半部分简单
     * 直接就是打印每一行的第一个i前面输出a个空格,这个a=k
     * 然后就结束了,下面是代码具体实现
     */
     public static void main(String[] args){
            Scanner sc=new Scanner(System.in);
            //用户输入的数
            int num=sc.nextInt();
            if(num<4||(num-1)%3!=0)
                return;
            //计算出k
            int  k=(num-1)/3;
            char[] nums=new char[num];
            for(int i=0;i<num;i++){
                String str=sc.next();
                nums[i]=str.toCharArray()[0];
            }
            //进行打印上半部分
            int j=0;
            for(int i=0;i<k;i++) {
                //打印第i行的第一个字符前面的空格,空格数就为k-1也就是i
                int temp=i;
                while(temp>0) {
                    System.out.print(" ");
                    temp--;
                }
                //打印第i行的第一个字符
                System.out.print(nums[j]);
                j++;
                //打印第i行的中间的空格
                temp=2*(k-i)-1;
                while(temp>0) {
                    System.out.print(" ");
                    temp--;
                }
                //打印第i行的最后一个字符
                System.out.print(nums[j]);
                j++;
                System.out.println();
            }
            //进行打印下半部分
            for(int i=0;i<k+1;i++) {
                 int temp=k;
                while(temp>0) {
                    System.out.print(" ");
                    temp--;
                }
                System.out.print(nums[j]);
                j++;
                 System.out.println();
            }
        }

 


发表评论

电子邮件地址不会被公开。