java算法题-山羊拉丁文

在leetcode(https://leetcode-cn.com/)上看到一道有趣的算法题:

给定一个由空格分割单词的句子 S。每个单词只包含大写或小写字母。

我们要将句子转换为 “Goat Latin”(一种类似于 猪拉丁文 - Pig Latin 的虚构语言)。

山羊拉丁文的规则如下:

  • 如果单词以元音开头(a, e, i, o, u),在单词后添加"ma"。例如,单词"apple"变为"applema"。
  • 如果单词以辅音字母开头(即非元音字母),移除第一个字符并将它放到末尾,之后再添加"ma"。例如,单词"goat"变为"oatgma"。
  • 根据单词在句子中的索引,在单词最后添加与索引相同数量的字母’a’,索引从1开始。例如,在第一个单词后添加"a",在第二个单词后添加"aa",以此类推。

返回将 S 转换为山羊拉丁文后的句子。

示例 1:

输入: “I speak Goat Latin”

输出: “Imaa peaksmaaa oatGmaaaa atinLmaaaaa”

示例 2:

输入: “The quick brown fox jumped over the lazy dog”

输出: “heTmaa uickqmaaa rownbmaaaa oxfmaaaaa umpedjmaaaaaa overmaaaaaaa
hetmaaaaaaaa azylmaaaaaaaaa ogdmaaaaaaaaaa”

说明:

  • S 中仅包含大小写字母和空格。单词间有且仅有一个空格。
  • 1 <= S.length <= 150。

这样的题你会怎么用java实现呢?

分享一下我的解题思路:

public String toGoatLatin(String S) {
        StringBuffer buffer = new StringBuffer();
        String[] array = S.split(" ");
        for (int i = 0, length = array.length; i < length; i++) {
            if (startsWithVowel(array[i])) {
                /*以元音开头*/
                buffer.append(array[i]).append("ma");
            } else {
                /*以辅音字母开头*/
                int childLength = array[i].length();
                if (childLength > 1) {
                    buffer.append(array[i].substring(1, childLength))
                            .append(array[i].charAt(0))
                            .append("ma");
                } else {
                    buffer.append(array[i])
                            .append("ma");
                }

            }
            buffer.append(getJoinStr(i+1, "a"));
            if(i<length-1){
                buffer.append(" ");
            }
        }
        return buffer.toString();
    }

    /**
     * 判断s是否以元音(a, e, i, o, u)开头
     */
    private boolean startsWithVowel(String s) {
        return s.toLowerCase().startsWith("a")
                        || s.toLowerCase().startsWith("e")
                        || s.toLowerCase().startsWith("i")
                        || s.toLowerCase().startsWith("o")
                        || s.toLowerCase().startsWith("u");
    }

    /**
     * 返回对应数量字符串拼接起来的字符串
     */
    private String getJoinStr(int num, String s) {
        StringBuffer buffer = new StringBuffer();
        for (int i = 0; i < num; i++) {
            buffer.append(s);
        }
        return buffer.toString();
    }

结果:

输入:“I speak Goat Latin” 输出:“Imaa peaksmaaa oatGmaaaa atinLmaaaaa”

leetcode上对该答案的分析如下:

99 / 99 个通过测试用例

状态:通过

执行用时: 3 ms

内存消耗: 38.5 MB

执行用时分布图表 java算法题-山羊拉丁文
执行消耗内存分布图表 java算法题-山羊拉丁文

大家有更好的解题思路吗?欢迎在评论区作答哈~
有问题也可发送至:1966353889@qq.com
欢迎交流,共同进步。

上一篇:element-ui upload组件手动上传 , 一次请求多张图片合并上传到PHP后台


下一篇:javascript js字母大小写转换方法