相对开音节构成的结构为辅音+元音(aeiou)+辅音(r除外)+e,常见的单词有life,time,woke,coke,joke,note,nose,communicate,use,gate,same,late等。
给定一个字符串,以空格为分隔符,反转每个单词中的字母,若单词中包含如数字等其他非字母时不进行反转。
反转后计算其中含有相对开音节结构的子串个数(连续的子串中部分字符可以重复)。
字符串,以空格分割的多个单词,字符串长度<10000,字母只考虑小写。
含有相对开音节结构的子串个数,注:个数<10000
// 定义一个列表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;
}
efil emit ekow
反转之后是life,time,woke
,都是相对开音节子串,因此返回结果3。efil emit 5ekow
反转之后是life,time,5ekow
,因5ekow含非英文字符所以未反转,因此返回结果2。下一篇:华为OD机试真题 Java 实现【跳房子II】【2023 B卷 100分】,附详细解题思路
本文收录于,华为OD机试(JAVA)(2022&2023)
本专栏包含了最新最全的2023年华为OD机试真题,有详细的分析和Java解答。已帮助1000+同学顺利通过OD机考。专栏会持续更新,每天在线答疑。