起因
晚上在休闲游戏中,一网友发来信息求问,一道编程题。
咋一看,嘿 2023年1月浙江选考题(信息技术),挺新鲜,那就来看看吧。
聊了一下才知道,这是中考高考(6月28日晚23:05更正)选题。中考高考(6月28日晚23:05更正)就考这样的了吗?
一、题目
二、解析
因为题解想半天,没看明白要做的,就先直接上手代码去测试实验。通过足够多的次数去请求,就可以知道正确答案了(不符合出现的)。
后面恍然大悟会进一步讲解内容
二、代码测试
把该代码转成 java 对应的代码内容,并进行测试
public static void main(String[] args) {// 答案记录Map<String, Integer> ansMap = new HashMap<>();ansMap.put("AB##CD#", 0); // 选项A 答案ansMap.put("#######", 0); // 选项B 答案ansMap.put("#B##CDA", 0); // 选项C 答案ansMap.put("###ABCD", 0); // 选项D 答案for (int i = 0; i < 100000; i++) { // 10万次执行,看看 ABCD 答案是哪个一直没有出现String res = runWork(); // 出现的结果if (ansMap.get(res) == null){ // 出现和选项答案不一致的跳过continue;}// 出现一致的进行+1ansMap.put(res, ansMap.get(res) + 1);}// 输出结果System.out.println(ansMap.toString());
}public static String runWork() {char[] a = {'A', 'B', '#', '#', 'C', 'D', '#'};char[] stk = new char[a.length];int top = -1;Random random = new Random();for (int i = 0; i < a.length; i++) {int op = random.nextInt(2);if (op == 1 && a[i] != '#') {top++;stk[top] = a[i];a[i] = '#';} else if (op == 0 && top != -1 && a[i] == '#') {a[i] = stk[top];top--;}}return String.valueOf(a);
}
三、测试结果
截图中可以看到,测试中,A、B、C 选项都出现了,不符合的是 D 选项,因此,正确答案是选项 D。
四、恍然大悟(真正解析)
仔细瞧命名, stk ,是栈(stack)的简写!可恶,这道题可以直接利用栈的知识去看选项去解了啊…
原字符数组是
'A', 'B', '#', '#', 'C', 'D', '#'
栈,就是先进后出。
选项 | 内容 | 解析 |
---|---|---|
A | AB##CD# | 对 a 字符数组都不进行拿出拿入,stk 字符数组就是空, 也就是不变,那么结果可以出现 |
B | ####### | 对 a 字符数组的ABCD都拿走,最终 stk 字符数组里就是 DCBA, 那么结果也可以出现 |
C | #B##CDA | 对 a 字符数组都只拿A,并在最后一个的时候拿出最上层的。 最上层只有一个 A ,那就拿出 A , 此时 stk 字符数组就为空了,那么结果可以出现 |
D | ###ABCD | 对 a 字符数组先拿A,stk 里就有 A ,但是B也需要拿, 且 A 要放在 B 拿之前的后面,不能实现,那么结果是不可以出现的! |
图解:
那么最终,也就能明白这套代码的意思了,就是随机可能去拿去里面的字母,ABCD,放到栈里再实现放到原数组中去。对栈的理解与使用解释了一下。答案选 D ,只有 D 不符合栈的进出。
文章小尾巴
文章小尾巴(点击展开)文章写作、模板、文章小尾巴可参考:《写作“小心思”》
感谢你看到最后,最后再说两点~
①如果你持有不同的看法,欢迎你在文章下方进行留言、评论。
②如果对你有帮助,或者你认可的话,欢迎给个小点赞,支持一下~
我是南方者,一个热爱计算机更热爱祖国的南方人。
(文章内容仅供学习参考,如有侵权,非常抱歉,请立即联系作者删除。)