华为OD统一考试A卷+B卷 新题库说明
2023年5月份,华为官方已经将的 2022/0223Q(1/2/3/4)统一修改为OD统一考试(A卷)和OD统一考试(B卷)。
你收到的链接上面会标注A卷还是B卷。请注意:根据反馈,目前大部分收到的都是B卷。但是仍有概率抽到A卷。
A卷对应2023的新题库(2022Q4 20223Q1) B卷对应20022部分考题以及新出的题目
专栏:2023华为OD机试(A卷+B卷)(C++JavaJSPy)
题目描述
给定一个小写字母组成的字符串 s,请找出字符串中两个不同位置的字符作为分割点,使得字符串分成三个连续子串且子串权重相等,注意子串不包含分割点。
若能找到满足条件的两个分割点,请输出这两个分割点在字符串中的位置下标,若不能找到满足条件的分割点请返回0,0。
子串权重计算方式为:子串所有字符的ASCII码数值之和。
输入描述
输入为一个字符串,字符串由a~z,26个小写字母组成,5 ≤ 字符串长度 ≤ 200。
输出描述
输出为两个分割点在字符串中的位置下标,以逗号分隔
备注
只考虑唯一解,不存在一个输入多种输出解的情况
用例
输入 | acdbbbca |
输出 | 2,5 |
说明 | 以位置2和5作为分割点,将字符串分割为ac,bb,ca三个子串,每一个的子串权重都为196,输出为:2,5 |
输入 | abcabc |
输出 | 0,0 |
说明 | 找不到符合条件的分割点,输出为:0,0 |
解题思路
-
读取输入字符串
-
计算前缀和数组:为了方便计算子串的权重,我们创建一个前缀和数组,数组的每个元素表示从输入字符串的起始位置到当前位置的字符权重之和。权重可以是字符的 ASCII 码值。这样,我们可以通过前缀和数组快速计算任意子串的权重。
-
初始化结果和分割点:我们初始化结果为 “0,0”,表示没有找到满足条件的分割点。同时,我们初始化两个分割点,第一个分割点为 1,第二个分割点为 3。
-
遍历分割点:我们使用一个循环来遍历所有可能的分割点组合。在每次循环中,我们计算三个子串的权重,然后根据子串权重来调整分割点。
a. 计算三个子串的权重:我们使用前缀和数组来计算三个子串的权重。具体来说,我们分别计算从起始位置到第一个分割点、从第一个分割点到第二个分割点、从第二个分割点到字符串末尾的子串权重。
b. 判断是否满足条件:如果三个子串的权重相等,说明我们找到了满足条件的分割点。此时,我们更新结果为当前分割点组合,并跳出循环。
c. 调整分割点:如果三个子串的权重不相等,我们需要调整分割点。具体来说,如果第一个子串的权重小于等于第二个子串的权重,我们将第一个分割点向右移动一位;否则,我们将第二个分割点向右移动一位。这样,我们可以保证在尽可能短的时间内找到满足条件的分割点。