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

五、Java算法源码

// 定义一个列表aeiouList,存储元音字母(a, e, i, o, u)
private static final List<Character> aeiouList = new ArrayList<>();

static {
    char[] f1 = {'a', 'e', 'i', 'o', 'u'};
    for (char c : f1) {
        aeiouList.add(c);
    }
}

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    // 从输入中读取字符串,并按空格分割为多个单词,存储在input数组中
    String[] arr = sc.nextLine().split(" ");
    // 初始化total为0,表示含有相对开音节结构的子串个数
    int total = 0;
    // 遍历input数组中的每个单词content
    for (String s : arr) {
        boolean flag = true;
        for (int j = 0; j < s.length(); j++) {
            // 对于每个单词,首先判断是否只包含字母,如果不是,则跳过该单词
            if (s.charAt(j) < 'a' || s.charAt(j) > 'z') {
                flag = false;
                break;
            }
        }
        // 如果单词只包含字母,则调用checkKai方法计算该单词中含有相对开音节结构的子串个数,并累加到total中
        if (flag) {
            total += checkKai(s);
        }
    }
    // 输出total作为结果
    System.out.println(total);
}

/**
 * 计算该单词中含有相对开音节结构的子串个数,并累加到total中
 */
private static int checkKai(String str) {
    // 反转每个单词中的字母
    StringBuilder reversalBuilder = new StringBuilder();
    for (int i = str.length() - 1; i >= 0; i--) {
        reversalBuilder.append(str.charAt(i));
    }

    int left = 0;
    int right = 0;
    int total = 0;
    String temp = "";
    while (right <= str.length()) {
        // 每4个字符取出一个子串
        temp = reversalBuilder.substring(left, right);
        if (temp.length() < 4) {
            right++;
            continue;
        }
        // 字符串是否是相对开音节
        if (check(temp)) {
            total++;
        }
        left++;
        right++;

    }
    return total;
}

/**
 * 字符串是否是相对开音节
 */
private static boolean check(String str) {
    // 相对开音节构成的结构为辅音+元音(aeiou)+辅音(r除外)+e
    if (!aeiouList.contains(str.charAt(0)) && 'e' == str.charAt(str.length() - 1)) {
        // 元音下角标
        int yuanIndex = 0;
        for (int i = 1; i < str.length() - 1; i++) {
            // 找到元音的下角标
            if (aeiouList.contains(str.charAt(i))) {
                yuanIndex = i;
            }
            // 相对开音节构成的结构为辅音+元音(aeiou)+辅音(r除外)+e
            if (yuanIndex != 0 && !aeiouList.contains(str.charAt(i)) && str.charAt(i) != 'r' && i > yuanIndex) {
                return true;
            }
        }
    }
    return false;
}

六、效果展示

1、efil emit ekow反转之后是life,time,woke,都是相对开音节子串,因此返回结果3。

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

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

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


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

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

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

在这里插入图片描述

你可能感兴趣的:(搬砖工逆袭Java架构师,java,开发语言,算法,华为)