小美搭积木(Java)
美团笔试题
链接:https://www.nowcoder.com/discuss/625614?channel=-1&source_id=profile_follow_post_nctrack
来源:牛客网
时间限制: 3000MS
题目描述:
小美想要为小团摆一行积木,每个积木上都有一个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)