第十一届蓝桥杯Java省赛第二场B组部分题解
发表时间:2020-10-18
发布人:葵宇科技
浏览次数:66
本文章会讲解部分题解(因为有的题不会!!,太菜了),如果大家发现解答有问题,可以留言,大家一起讨论。
试题A:
答案:624
public static void main(String[] args) {
// TODO Auto-generated method stub
int a = 1;
int count = 0;
while (true) {
String b = a + "";
for (int i = 0; i < b.length(); i++) {
if (b.charAt(i) == '2') {
count++;
}
}
a++;
if (a == 2021) {
System.out.println(count);
return;
}
}
}
第一题相对简单,直接从1到2020遍历,判断有多少个2即可。
试题C:
答案: 761
public static void main(String[] args) {
// TODO Auto-generated method stub
int a = 1;
for (int i = 0; i < 20; i++) {
a = a + (i * 4);
System.out.println(a);
}
}
解题思路:先手写几行就可以发现,第一行第一列的值为1,第二行第二列的值为5.第三行第三列的值为13,第四行第四列的值为25,仔细观察就可以发现第i行第i列的值为 a = a + (i*4)。
试题F:
答案: jonmlkihgfedcba
public static void main(String[] args) {
// TODO Auto-generated method stub
String a = "jonmlkihgfedcba";
StringBuffer sb = new StringBuffer(a);
int i = 0;
int count = 0;
while (true) {
if (i < a.length() - 1 && a.charAt(i) > a.charAt((i + 1))) {
sb.replace(i, i + 1, a.charAt((i + 1)) + "");
sb.replace(i + 1, i + 2, a.charAt((i)) + "");
a = sb.toString();
count++;
continue;
} else if (i < a.length() - 1 && i - 1 >= 0 && a.charAt(i) < a.charAt((i - 1))) {
sb.replace(i - 1, i, a.charAt((i)) + "");
sb.replace(i, i + 1, a.charAt((i - 1)) + "");
a = sb.toString();
count++;
i--;
continue;
} else {
i++;
if (i == a.length() - 1) {
System.out.println(count);
System.out.println(a);
break;
}
}
}
if (count == 100) {
System.out.println(a);
return;
}
}
解题思路:首先根据题目所给交换规则,写一个完整的程序,并且当交换完成之后,要输出交换次数(count),和最后的结果(a),输出这两个值来判断程序是否正确。例如:当a为lan时,输出1 和aln;当a为waqs时,输出3和aqsw。此时,就可以开始找长度最短,并且字典序最小的呢个字符串了。题目中最后一句描述有错,应该是字符串中不能有重复的字符。当a=zyxw时,输出的count值为6,此时你应该知道,当字符串的长度为4时,最大的交换次数为6。因为最左边的要移动到最右边,最右边的要移动到最左边。所以首先根据这个找出满足条件的字符串长度,当a=zyxwvutsrqponm时,最大的交换次数为91,当a = zyxwvutsrqponml时,最大的交换次数为105,所以交换次数为100的字符串的长度必定为15。而且还需要字典序最小,所以从a开始倒叙排列15个字符, a=onmlkjihgfedcba时,交换次数为105次,为了满足交换次数恰好100次,将j向前移动5位即可。所以答案为jonmlkihgfedcba。
试题F:
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
int count = s.nextInt();
DecimalFormat df = new DecimalFormat(".00");
int arr[] = new int[count];
double num = 0;
for (int i = 0; i < arr.length; i++) {
arr[i] = s.nextInt();
num += arr[i];
}
Arrays.sort(arr);
System.out.println(arr[count - 1]);
System.out.println(arr[0]);
System.out.println(df.format(num / count));
}
这道题没有什么技术含量,考的主要是基础,感兴趣的朋友可以将多种保留小数的方式测试一下。
试题G:
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner s = new Scanner(System.in);
int max = -1;
char maxs = 'a';
String a = s.next();
HashMap<String, Integer> map = new HashMap<>();
for (int i = 0; i < a.length() - 1; i++) {
if (map.get(a.charAt(i) + "") != null) {
int num = (int) map.get(a.charAt(i) + "");
map.remove(a.charAt(i) + "");
num++;
map.put(a.charAt(i) + "", num);
} else {
map.put(a.charAt(i) + "", 1);
}
}
Object[] arr = map.entrySet().toArray();
for (int i = 0; i < arr.length; i++) {
String arr2[] = (arr[i] + "").split("=");
if ((Integer.parseInt(arr2[1])) >= max) {
if ((Integer.parseInt(arr2[1])) == max) {
if (arr2[0].charAt(0) > maxs) {
maxs = arr2[0].charAt(0);
continue;
}
}
max = (Integer.parseInt(arr2[1]));
maxs = arr2[0].charAt(0);
}
}
System.out.println(maxs);
System.out.println(max);
}
解题思路:使用map集合对每个字符出现的次数进行保存,最后将结果转成数组进行遍历,找出出现最多的字符。
试题I:
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner s = new Scanner(System.in);
String a = s.next();
HashMap<String, Integer> map = new HashMap<>();
int count = 0;
for (int i = 0; i < a.length(); i++) {
for (int j = i + 1; j <= a.length(); j++) {
String b = a.substring(i, j);
map.clear();
for (int k = 0; k < b.length(); k++) {
if (map.get(b.charAt(k) + "") == null) {
map.put(b.charAt(k) + "", 1);
}
}
count += map.size();
}
}
System.out.println(count);
}
解题思路:首先利用双指针对字符串进行截取,截取之后逐个取出字符串的每个字符串存入map集合,如果map集合中没有此字符串则放入map集合中,最后获取size。其实这里可以利用set本身去重的特点,来替换map集合。