专栏文章

对于汉语拼音,你真的了解吗

算法·理论参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@miouf68g
此快照首次捕获于
2025/12/03 01:19
3 个月前
此快照最后确认于
2025/12/03 01:19
3 个月前
查看原文
U513346 小怡同学的特殊称呼 自创题地址
我们班有个小姑娘,对大家挺“好”的,只是有的时候喜欢“抽风”,就比如称呼别人的时候把别人第二个字改成“小”,本人的这道题也是源于这个真实的小趣闻

说回题目,这题固定是三个字的名字,而且你也可以理解为提取出第一个字,第三个字,其实是方便大家去找规律的。你要是硬把所有的拼音组合都找出来,反而是麻烦的写法。
汉语拼音通常为声母加韵母(当然也有像 ang'ang 这种的),其中韵母无非由a,o,e,i,u,va,o,e,i,u,v组成,有的后面再加一个nnngng就结束了。
第一个字的提取,从字符串0位置开始排查,遇到韵母所属字母就标记,再遇到声母所属字母就结束,遇到nn,ngng特判以下,问题应该不大。
第三个字的提取,从(n1)(n-1)位置往前排查,遇到除h的声母所在字母直接停止,遇到h再特判前面一位是不是z,c,sz,c,s即可。
直接上代码,自己稍微改良了一下,解决了二三字之间gghh的问题。
CPP
#include <bits/stdc++.h>
using namespace std;
string s,s1,s2="xiao",s3;
bool a['z'+1],vis,vi2;
int main()
{
	a['a']=a['e']=a['i']=a['o']=a['u']=a['v']=1;
	cin>>s;
	for(int i=0;i<s.size();++i){
		if(a[s[i]]) vis=1;
		else if(vis){
			if(!a[s[i]]){
				if(s[i]=='g'){
					if(a[s[i+1]]) break;
				}else if(s[i]=='n'){
					if(a[s[i+1]]){
						cout<<s[i+1]<<" "<<a[s[i+1]]<<endl; 
						break;
					} 
				}else break;
			}
		}
		s1+=s[i];
	}
	
	for(int i=s.size()-1;i>=0;--i){
		if(a[s[i]]) vi2=1;
		else if(vi2){
			if(!a[s[i]]){
				if(s[i]=='h'){
					s3=s[i]+s3;
                    //这样写就错了:if(!a[s[i-1]]) s3=s[i-1]+s3;
					if(s[i-1]=='z' or s[i-1]=='c' or s[i-1]=='s') s3=s[i-1]+s3;
					break;
				}else {
					s3=s[i]+s3;
					break;
				}
			}
		}
		s3=s[i]+s3;
	}
	cout<<s1<<s2<<s3;
	return 0;
}
这道题主要就是字符串的基本操作,重点在于能否找出这个“显而易见”的规律。(虽然我们的主人公小怡同学对这一点不感兴趣)

评论

0 条评论,欢迎与作者交流。

正在加载评论...