一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第20天,点击查看活动详情。
今天的这道题属实是用例题
山羊拉丁文
该题出自力扣的824题 —— 山羊拉丁文【简单题】
审题
- 该题的题意有点绕,但是并不影响它身为简单题 —— 给出一个字符串,字符串由一串单词和空格组成,单词由空格隔开。
- 每个元音字母为开头的单词,在末尾加上"ma"
- 如果非语音字母,则把首字母移动到末尾,再加上“ma”
- 根据单词的下标决定在单词的末尾加多少个“a”
- 首先需要注意的是,字母是忽略大小写的。
- 解法:直接枚举
- 把字符串利用split拆分成数组
- 定义一个StringBuilder,去作为末尾添加"a"的个数,初始值为一个a
- 遍历数组
- 定义一个StringBuilder
- 获取字符串的首个字符,判断是否为元音(a/e/i/o/u/A/E/I/O/U),如果为元音,则用StringBuilder.append方法加上“ma”
- 如果不是元音,则利用substring(1)方法截取第一个字符后的所有字符,再用append方法拼接
- 最后再遍历一次把数组拼接起来
- 这里一开始是想使用StringUtils包里面的join方法的,Leetcode本身并不支持,所以只能自己遍历拼接了
- 时间复杂度为O(n),因为遍历数组一次循环
- 空间复杂度为O(n),取决于是否使用额外的空间去存储字符串切片,如果不修改,则需要用一个Set或者Map去存储,O(n2) 的空间临时存储所有单词修改后的结果
编码
class Solution {
public String toGoatLatin(String sentence) {
String[] s = sentence.split(" ");
StringBuilder sba = new StringBuilder("a");
for (int i = 0;i<s.length;i++) {
String a = s[i];
StringBuilder sb = new StringBuilder();
char c = a.charAt(0);
switch (c){
case 'A':
case 'E':
case 'I':
case 'O':
case 'U':
case 'a':
case 'e':
case 'i':
case 'o':
case 'u':
sb.append(a);
sb.append("ma");
break;
default:
sb.append(a.substring(1));
sb.append(c);
sb.append("ma");
break;
}
sb.append(sba.toString());
sba.append("a");
s[i] = sb.toString();
}
StringBuilder sbq = new StringBuilder();
for(String q:s){
sbq.append(q);
sbq.append(" ");
}
sbq.deleteCharAt(sbq.length() -1);
return sbq.toString();
}
}