华为OD机试真题 JavaScript 实现【相对开音节】【2022Q4 100分】,附详细解题思路

在这里插入图片描述

一、题目描述

相对开音节构成的结构为辅音+元音(aeiou)+辅音(r除外)+e,常见的单词有life,time,woke,coke,joke,note,nose,communicate,use,gate,same,late等。

给定一个字符串,以空格为分隔符,反转每个单词中的字母,若单词中包含如数字等其他非字母时不进行反转。

反转后计算其中含有相对开音节结构的子串个数(连续的子串中部分字符可以重复)。

二、输入描述

字符串,以空格分割的多个单词,字符串长度<10000,字母只考虑小写。

三、输出描述

含有相对开音节结构的子串个数,注:个数<10000

四、解题思路

  1. 定义一个列表aeiouList,存储元音字母(a, e, i, o, u);
  2. 从输入中读取字符串,并按空格分割为多个单词,存储在input数组中;
  3. 初始化total为0,表示含有相对开音节结构的子串个数;
  4. 遍历input数组中的每个单词s;
  5. 对于每个单词,首先判断是否只包含字母,如果不是,则跳过该单词;
  6. 如果单词只包含字母,则调用checkKai方法计算该单词中含有相对开音节结构的子串个数,并累加到total中;
    • 反转每个单词中的字母;
    • 每4个字符取出一个子串;
    • 判断字符串是否是相对开音节,total++;
      • 相对开音节构成的结构为辅音+元音(aeiou)+辅音(r除外)+e;
      • 定义一个元音下角标yuanIndex;
      • 找到元音的下角标;
      • 通过“相对开音节构成的结构为辅音+元音(aeiou)+辅音(r除外)+e”判断是否是相对开音节;
  7. 输出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。

华为OD机试真题 JavaScript 实现【相对开音节】【2022Q4 100分】,附详细解题思路_第1张图片

2、efil emit 5ekow反转之后是life,time,5ekow,因5ekow含非英文字符所以未反转,因此返回结果2。

华为OD机试真题 JavaScript 实现【相对开音节】【2022Q4 100分】,附详细解题思路_第2张图片


下一篇:华为OD机试真题 Java 实现【跳房子II】【2023 B卷 100分】,附详细解题思路

本文收录于,华为OD机试(JAVA)(2022&2023)

本专栏包含了最新最全的2023年华为OD机试真题,有详细的分析和Java解答。已帮助1000+同学顺利通过OD机考。专栏会持续更新,每天在线答疑。

在这里插入图片描述

你可能感兴趣的:(搬砖工逆袭Java架构师,javascript,数学建模,java,华为,算法)