我是没想到是还可以这样秒出答案 ...
起因
晚上在休闲游戏中,一网友发来信息求问,一道编程题。
咋一看,嘿 2023年1月浙江选考题(信息技术),挺新鲜,那就来看看吧。
聊了一下才知道,这是中考高考(6月28日晚23:05更正)选题。中考高考(6月28日晚23:05更正)就考这样的了吗?
一、题目
二、解析
因为题解想半天,没看明白要做的,就先直接上手代码去测试实验。通过足够多的次数去请求,就可以知道正确答案了(不符合出现的)。
后面恍然大悟会进一步讲解内容
二、代码测试
把该代码转成 java 对应的代码内容,并进行测试
public static void main(String[] args) {
// 答案记录
Map 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;
}
// 出现一致的进行+1
ansMap.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 不符合栈的进出。
作者:南方者
来源:juejin.cn/post/7249288803532947517
来源:juejin.cn/post/7249288803532947517