308 选择题反选效果分析 | 豆包MarsCode AI刷题

45 阅读3分钟

问题描述

小U正在检查某同学的选择题答案。试卷共有 n 道题目,每道题目只有两个选项 A 和 B。当前小U手上有两组答案:

  1. s:该同学的原始答案。
  2. t:标准答案。

小U想知道,如果将该同学的所有答案都反选(即:如果某题的答案是 A 则改成 B,如果是 B 则改成 A),那么在反选之后,正确的答案数量是否会增加?具体结果有三种可能:

  1. 如果反选后的正确答案数 增加,输出 "yes"。
  2. 如果反选后的正确答案数 不变,输出 "draw"。
  3. 如果反选后的正确答案数 减少,输出 "no"。

问题理解

  1. 有两个数组,其中一个数组为标准答案,需要比较两个数组相同位置上的元素是否相同,统计相同元素的个数
  2. 每道题目只有2个选项,说明只用统计相同元素就行,反选可以由 n - 相同元素个数直接得出

解题思路

  1. 定义初始变量 correctNum,用于统计两数组同一位置相同元素的个数
  2. 由于测试样例都不可能为空,所以先将字符串转化为字符数组,便于后续直接根据索引获取指定位置元素
  3. 任取一个数组进行遍历(两个数组长度相同,可以看作有映射关系,取哪个都一样)
  4. 如果同一位置上两个数组的字符相同,计数增加1
  5. 循环结束,correctNum已统计完两数组同一位置相同元素的个数
  6. 定义字符串变量result,用于输出结果
  7. 比较是当前correctNum更大,还是反选更大
  8. 当前更大不需要反选,输出no,等大输出draw, 反选更大需要反选输出yes

代码详解

public static String solution(int n, String s, String t) {
        // 1 统计两数组同一位置相同元素的个数
        int correctNum = 0; 
        char[] sArray = s.toCharArray();
        char[] tArray = t.toCharArray();
        for (int i = 0; i < tArray.length; i++) {
            // 2 同位置元素相同,计数增加1
            if (sArray[i] == tArray[i]) {
                correctNum += 1;
            }
        }
        // 3 输出结果
        String result;
        if (correctNum < n - correctNum) {
            result = "yes";
        } else if (correctNum > n - correctNum) {
            result = "no";
        } else {
            result = "draw";
        }
        return result;
    }

复杂度计算

空间复杂度:O(n), n是题目给定字符串的长度,需要将字符串转化为char类型数组,开辟2n个空间

时间复杂度:O(n)n是题目给定字符串的长度,需要遍历数组长度次

总结

知识点:

  1. 字符串操作:遍历和字符数组的转换和操作。
  2. 条件判断,计数器
  3. 本题先将字符串转为字符数组(char[])来存储和操作答案字符串,相较于直接通过字符串截取性能更号,且更方便取逐个字符比较。

作者:Hewson
链接:juejin.cn/post/744077…
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。