一、题目描述
相对开音节构成的结构为辅音+元音(aeiou)+辅音(r除外)+e,常见的单词有life,time,woke,coke,joke,note,nose,communicate,use,gate,same,late等。
给定一个字符串,以空格为分隔符,反转每个单词中的字母,若单词中包含如数字等其他非字母时不进行反转。
反转后计算其中含有相对开音节结构的子串个数(连续的子串中部分字符可以重复)。
二、输入描述
字符串,以空格分割的多个单词,字符串长度<10000,字母只考虑小写。
三、输出描述
含有相对开音节结构的子串个数,注:个数<10000
四、解题思路
- 定义一个列表aeiouList,存储元音字母(a, e, i, o, u);
- 从输入中读取字符串,并按空格分割为多个单词,存储在input数组中;
- 初始化total为0,表示含有相对开音节结构的子串个数;
- 遍历input数组中的每个单词s;
- 对于每个单词,首先判断是否只包含字母,如果不是,则跳过该单词;
- 如果单词只包含字母,则调用checkKai方法计算该单词中含有相对开音节结构的子串个数,并累加到total中;
- 反转每个单词中的字母;
- 每4个字符取出一个子串;
- 判断字符串是否是相对开音节,total++;
- 相对开音节构成的结构为辅音+元音(aeiou)+辅音(r除外)+e;
- 定义一个元音下角标yuanIndex;
- 找到元音的下角标;
- 通过“相对开音节构成的结构为辅音+元音(aeiou)+辅音(r除外)+e”判断是否是相对开音节;
- 输出total作为结果。
五、Java算法源码
function getXDKYJCount(str) {
// 定义一个列表aeiouList,存储元音字母(a, e, i, o, u)
const aeiouList = ['a', 'e', 'i', 'o', 'u'];
// 从输入中读取字符串,并按空格分割为多个单词,存储在数组arr中
const arr = str.split(' ');
// 初始化total为0,表示含有相对开音节结构的子串个数
let total = 0;
// 遍历input数组中的每个单词
for (let i = 0; i < arr.length; i++) {
const content = arr[i];
let flag = true;
for (let j = 0; j < content.length; j++) {
// 对于每个单词,首先判断是否只包含字母,如果不是,则跳过该单词
if (content[j] < 'a' || content[j] > 'z') {
flag = false;
break;
}
}
// 如果单词只包含字母,则调用checkKai方法计算该单词中含有相对开音节结构的子串个数,并累加到total中
if (flag) {
total += checkKai(content);
}
}
// 输出total作为结果
return total;
}
/**
* 计算该单词中含有相对开音节结构的子串个数,并累加到total中
*/
function checkKai(str) {
// 反转每个单词中的字母
const strTemp = str.split('').reverse().join('');
let left = 0;
let right = 0;
let total = 0;
let tem = '';
while (right <= str.length) {
tem = strTemp.substring(left, right);
// 每4个字符取出一个子串
if (tem.length < 4) {
right++;
continue;
}
// 字符串是否是相对开音节
if (check(tem)) {
total++;
}
left++;
right++;
}
return total;
}
/**
* 字符串是否是相对开音节
*/
function check(str) {
const aeiouList = ['a', 'e', 'i', 'o', 'u'];
// 相对开音节构成的结构为辅音+元音(aeiou)+辅音(r除外)+e
if (!aeiouList.includes(str[0]) && str[str.length - 1] === 'e') {
// 元音下角标
let temYuan = 0;
for (let i = 1; i < str.length - 1; i++) {
// 找到元音的下角标
if (aeiouList.includes(str[i])) {
temYuan = i;
}
// 相对开音节构成的结构为辅音+元音(aeiou)+辅音(r除外)+e
if (temYuan !== 0 && !aeiouList.includes(str[i]) && str[i] !== 'r' && i > temYuan) {
return true;
}
}
}
return false;
}
六、效果展示
1、efil emit ekow
反转之后是life,time,woke
,都是相对开音节子串,因此返回结果3。
2、efil emit 5ekow
反转之后是life,time,5ekow
,因5ekow含非英文字符所以未反转,因此返回结果2。
🏆下一篇:华为OD机试真题 Java 实现【跳房子II】【2023 B卷 100分】,附详细解题思路
🏆本文收录于,华为OD机试(JAVA)(2022&2023)
本专栏包含了最新最全的2023年华为OD机试真题,有详细的分析和Java解答。已帮助1000+同学顺利通过OD机考。专栏会持续更新,每天在线答疑。