小美搭积木(Java)

美团笔试题
链接:https://www.nowcoder.com/discuss/625614?channel=-1&source_id=profile_follow_post_nctrack
来源:牛客网

时间限制: 3000MS

内存限制: 1048576KB

题目描述:
小美想要为小团摆一行积木,每个积木上都有一个0-9的数字。现在已经摆好了 n 块积木,小美可以把其中一块积木替换成任意一块积木(也可以不替换),使得积木看起来更符合小美的审美。请你帮小美看看,替换后最好看的积木是什么样的。
摆好后的积木上面的数字,从左到右会形成一个数字串(由数字组成的字符串)。小美会根据这个数字串来评判积木的好看程度,小美有两条审美标准:
回文数字串相比于非回文数字串更符合小美的审美。例如:12321、2332是回文数字串,而12212、2121不是回文数字串。
②数字串形成的数字更小更好看。例如:1312比1313更好看,0102比1102更好看。
小美会按照她的审美标准来判断两个数字串哪个更好看,即先按照审美标准①判断,若无法判断再按审美标准②判断。

输入描述
第一行一个数 T,表示一共有 T 组测试数据。(1 ≤ T ≤ 100)。
接下来 T 组数据,每组数据两行,
第一行一个数 n,表示有 n 块积木。(1 ≤ n ≤ 20000)。
第二行 n 个数字,第 i 块积木上的数字是 si。(si是0-9的数字)。

输出描述
每组数据输出一行,表示最终摆好的积木形成的数字串。

样例输入
2
5
00011
5
11210
样例输出
00001
01210

提示
第一组数据:
替换一块积木,无法使数字串变成回文数字串,因此只能数字串形成的数字最小。
第二组数据:

可以把第一块积木1换成0,也可以把第五块积木0换成1,从而使得积木是回文积木。又想要积木字典序最小,所以把第一块积木1替换成0。

import java.util.*;

public class Wood{
    public static void main(String[] args){
        int t,n;
        String wood;
        @SuppressWarnings("resource")
		Scanner sc = new Scanner(System.in);
        t = sc.nextInt();
        String[] out = new String[t];
        for(int i=0;i<t;i++)
        {
            n = sc.nextInt();
            wood = sc.next();
            int flag = -1;
            for(int j=0,k=n-1;j!=k && j != k+1;j++,k--)
            {
                if(wood.charAt(j) != wood.charAt(k))
                {
                    if(flag == -1)
                        flag = j;
                    else
                    {
                        flag = -2;
                        break;
                    }
                }
            }
            if(flag == -1)
            {
                if(wood.length()%2 != 0)
                {
                    int len = (wood.length()-1)/2;
                    out[i] = wood.substring(0,len)+"0"+wood.substring(len+1);
                }
                else
                    out[i] = wood;
            }
            else if(flag == -2)
            {
                for(int j=0;j<n;j++)
                {
                    if(wood.charAt(j) != '0')
                    {
                        //wood.charAt(j) = '0';
                        out[i] = wood.substring(0,j)+"0"+wood.substring(j+1);
                        break;
                    }
                }
            }
            else
            {
                if(wood.charAt(flag) < wood.charAt(n-1-flag))
                	out[i] = wood.substring(0,n-1-flag)+wood.charAt(flag)+wood.substring(n-flag);
                else
                	out[i] = wood.substring(0,flag)+wood.charAt(n-1-flag)+wood.substring(flag+1);
            }
        }
        for(int i=0;i<t;i++)
            System.out.println(out[i]);
    }
}

  分析:3种情况,是回文串(奇数回文串修改中间字符为‘0’)、修改一个字符就能变成回文串、不能变成回文串(将最大非零位数变成0)

 

posted @ 2021-03-27 20:09  梵蒂冈宝石  阅读(257)  评论(0编辑  收藏  举报