华为OD机试2025C卷-相对开音节[100分]( Java _ Python3 _ C++ _ C语言 _ JsNode _ Go)实现100%通过率
📫 个人主页:深夜coding算法
📣 专栏系列:2026年华为最新OD机试题库详解
🔥 一次订阅,永久解锁 | 持续更新100+篇 | 6语言全覆盖
文章目录
- ❄️前言:
- ☀️一:题目描述
- 🌙 题目名称
- 🌙 题目内容
- 🌙 输入描述
- 🌙 输出描述
- 🌙 示例
- ☀️二:解题思路
- ☀️三:代码实现
- C++
- Java
- Python3
- C语言
- JavaScript
- Go
- ☀️四:复杂度分析
- ⭐ 五:易错点
- 坑1:单词长度<4直接跳过
- 坑2:大小写不敏感?
- 🌻共勉:
❄️前言:
相对开音节是字符串+正则的经典题。核心是对字符串中每个长度≥4的单词,统计"辅音+元音+辅音+任意"模式的个数。
☀️一:题目描述
🌙 题目名称
相对开音节
🌙 题目内容
给定一个由小写字母和空格组成的字符串。定义:
- 元音字母:
a e i o u - 辅音字母:除元音外的字母
如果一个单词包含的子串满足:由一个辅音字母、一个元音字母、一个辅音字母、一个任意字母组成,且该子串从单词中位置开始,中间没有被空格隔开,则称为一个"相对开音节"。
统计整个字符串中所有单词里相对开音节的总个数。
🌙 输入描述
一行字符串,只含小写字母和空格,长度不超过 1000。
🌙 输出描述
输出整数,相对开音节总数。
🌙 示例
输入: cat dog 输出: 0 说明:cat长度<4,无;dog长度<4,无。结果0。输入: ekam a ekam 输出: 2☀️二:解题思路
- 按空格拆分单词
- 对于每个长度≥4的单词,滑动窗口检查长度为4的子串是否匹配"辅音+元音+辅音+任意"
- 计数累加
☀️三:代码实现
C++
#include<iostream>#include<string>#include<sstream>usingnamespacestd;boolisVowel(charc){returnc=='a'||c=='e'||c=='i'||c=='o'||c=='u';}intmain(){string line,word;getline(cin,line);stringstreamss(line);intans=0;while(ss>>word){if(word.size()<4)continue;for(inti=0;i<=word.size()-4;i++){if(!isVowel(word[i])&&isVowel(word[i+1])&&!isVowel(word[i+2])&&isVowel(word[i+3])!=isVowel(word[i]))ans++;}}cout<<ans<<endl;}Java
importjava.util.Scanner;publicclassMain{staticbooleanisVowel(charc){return"aeiou".indexOf(c)!=-1;}publicstaticvoidmain(String[]args){Scannersc=newScanner(System.in);String[]words=sc.nextLine().split(" ");intans=0;for(Stringw:words){if(w.length()<4)continue;for(inti=0;i<=w.length()-4;i++){if(!isVowel(w.charAt(i))&&isVowel(w.charAt(i+1))&&!isVowel(w.charAt(i+2)))ans++;}}System.out.println(ans);}}Python3
vowels=set('aeiou')words=input().strip().split()ans=0forwinwords:iflen(w)<4:continueforiinrange(len(w)-3):ifw[i]notinvowelsandw[i+1]invowelsandw[i+2]notinvowels:ans+=1print(ans)C语言
#include<stdio.h>#include<string.h>intisVowel(charc){returnc=='a'||c=='e'||c=='i'||c=='o'||c=='u';}intmain(){charline[1024],*word;gets(line);intans=0;word=strtok(line," ");while(word){intlen=strlen(word);for(inti=0;i<=len-4;i++)if(!isVowel(word[i])&&isVowel(word[i+1])&&!isVowel(word[i+2]))ans++;word=strtok(NULL," ");}printf("%d\n",ans);}JavaScript
constline=require('fs').readFileSync(0,'utf-8').trim();constwords=line.split(/\s+/);constvowels=newSet('aeiou');letans=0;for(constwofwords){if(w.length<4)continue;for(leti=0;i<=w.length-4;i++)if(!vowels.has(w[i])&&vowels.has(w[i+1])&&!vowels.has(w[i+2]))ans++;}console.log(ans);Go
packagemainimport("bufio";"fmt";"os";"strings")funcisVowel(cbyte)bool{returnstrings.ContainsRune("aeiou",rune(c))}funcmain(){scanner:=bufio.NewScanner(os.Stdin)scanner.Scan()ans:=0for_,w:=rangestrings.Fields(scanner.Text()){iflen(w)<4{continue}fori:=0;i<=len(w)-4;i++{if!isVowel(w[i])&&isVowel(w[i+1])&&!isVowel(w[i+2]){ans++}}}fmt.Println(ans)}☀️四:复杂度分析
| 指标 | 数值 |
|---|---|
| 时间复杂度 | O(N) |
| 空间复杂度 | O(1) |
⭐ 五:易错点
坑1:单词长度<4直接跳过
长度不够不可能形成4字符的开音节。
坑2:大小写不敏感?
输入只含小写字母,不需要额外处理(但要确认题目说明)。
🌻共勉:
正则/模式匹配的题,遍历+条件判断就够了,一般用不上真正的正则引擎。
📫关于本专栏:一次订阅,永久解锁全部100+篇真题详解
🔥6语言全覆盖:Java | Python3 | C++ | C语言 | JsNode | Go
