AI刷题-T6 T8 题解 | 豆包MarsCode AI刷题

62 阅读4分钟

2024-11-23 11:54

T26 小U的数字插入问题

一、题目分析

本题给出两个数字,一个是任意正整数 a,另一个是非负整数 b,要求将 b 插入到 a 的某个位置,从而得到一个最大的可能数字。关键在于如何遍历 a 的所有可能插入位置,并在每个位置插入 b 后准确比较得到最大的结果。

二、题解详细思路

(一)数据预处理

首先,将整数 ab 都转换为字符串形式,这是因为在后续操作中需要对数字的每一位进行处理,字符串的操作方式在这种情况下更加便捷。通过 String.valueOf() 方法分别将 a 转换为 aStr,将 b 转换为 bStr

(二)遍历插入位置并比较

接下来,我们要遍历数字 a 的每一个可能的插入位置,以找到插入 b 后能形成最大数字的那个位置。

  • 初始化一个变量 maxResultInteger.MIN_VALUE,这个变量将用于存储在遍历过程中找到的最大结果。

  • 开始遍历 aStr 的每一个位置 i,这里的遍历范围是从 0aStr.length(),包括 aStr 的开头和结尾位置。这是因为 b 可以插入到 a 的最前面或者最后面,以及中间的每一个位置。

  • 对于每一个位置 i,我们进行以下操作:

    • 插入操作:通过字符串的拼接操作,将 b 插入到当前位置 i,形成一个新的字符串 newStr。具体的拼接方式是先取 aStr 从开头到位置 i 的子字符串,然后加上 bStr,再加上 aStr 从位置 i 到结尾的子字符串,即 newStr = aStr.substring(0, i) + bStr + aStr.substring(i)
    • 转换回整数:将新生成的字符串 newStr 通过 Integer.parseInt() 方法转换回整数形式,得到 newNum。这一步是为了能够比较不同插入位置形成的数字大小。
    • 更新最大值:将 newNum 与当前存储的最大结果 maxResult 进行比较。如果 newNum 大于 maxResult,说明在当前插入位置形成的数字更大,那么就更新 maxResult 的值为 newNum

(三)返回结果

当遍历完 aStr 的所有可能插入位置后,maxResult 中存储的就是将 b 插入到 a 的某个位置后能得到的最大数字。最后,返回 maxResult 作为最终答案。

    public static int solution(int a, int b) {
        // 将整数a转换为字符串,方便处理每一位数字
        String aStr = String.valueOf(a);
        // 将整数b也转换为字符串
        String bStr = String.valueOf(b);
    
        int maxResult = Integer.MIN_VALUE;
    
        // 遍历数字a的每一个位置,尝试插入数字b
        for (int i = 0; i <= aStr.length(); i++) {
            // 插入数字b到当前位置,形成新的字符串
            String newStr = aStr.substring(0, i) + bStr + aStr.substring(i);
            // 将新字符串转换回整数
            int newNum = Integer.parseInt(newStr);
            // 更新最大结果
            if (newNum > maxResult) {
                maxResult = newNum;
            }
        }
    
        return maxResult;
    }

T8 小R找出现次数超半数的数字问题

一、题目分析

本题给出了从班级同学中抽取的一些数字,其中存在一个数字的出现次数超过了数字总数的一半。需要找到这个出现次数占优势的数字,关键在于如何准确统计每个数字的出现次数,并高效地判断出哪个数字满足出现次数超过总数一半的条件。

二、题解详细思路

(一)使用Map统计频率

我们可以使用一个 Map(例如 HashMap)来存储每个数字及其出现的频率。具体操作如下:

  • 遍历给定的数字数组。对于数组中的每一个数字,我们首先检查它是否已经在 Map 中存在。
    • 如果该数字已经在 Map 中,那么就获取它当前的出现频率,然后将频率加 1,并更新 Map 中该数字对应的频率值。
    • 如果该数字不在 Map 中,那么就将它作为新的键添加到 Map 中,并将其出现频率初始化为 1

(二)判断出现次数是否超半数

在遍历数组并更新 Map 中数字的频率过程中,我们需要同时判断每个数字的出现频率是否超过了数组长度的一半。

  • 对于 Map 中的每一个键值对(即每个数字及其对应的频率),我们在每次更新频率后,将当前数字的频率与数组长度除以 2 的结果进行比较。
    • 如果某个数字的频率大于数组长度除以 2 的值,那么就说明这个数字就是我们要找的出现次数超过总数一半的数字。此时,我们就可以直接返回这个数字作为答案。

通过以上步骤,我们就可以在给定的数字数组中找到那个出现次数超过总数一半的数字。

代码

    public static int solution(int[] array) {
        // Edit your code here
        Map<Integer, Integer> frequencyMap = new HashMap<>();
        int majorityCount = array.length / 2;
        for (int num : array) {
            int cnt = frequencyMap.getOrDefault(num, 0);
            if (cnt + 1 > majorityCount)
                return num;
            frequencyMap.put(num, cnt + 1);
        }
        return -1;
    }