【问题标题】:Finding where the first vowel in a word occurs查找单词中第一个元音出现的位置
【发布时间】:2014-10-30 18:09:34
【问题描述】:

我正在尝试编写一个将英语翻译成 PigLatin 的程序。我目前正在尝试解决关于在哪里定位单词的第一个元音的部分,这样程序可以正确地分割单词并正确地重新排列它。

例如,字符串“hello I am a guy”变成了“ellohay Iyay amyay ayay uygay”。 (在列表中,我认为我的猪拉丁语是正确的,这是我创建的一个示例。

所以“what”这个词变成了“atwhay”。程序发现第一个元音在插槽 2 中,然后给我那个整数 2。

我想先将它与一个字符串 vowels="aeiouy" 进行比较,然后从那里开始,但我被卡住了。 这是我所拥有的:

public static int indexOfFirstVowel(String word){
   int index=0;
   String vowels="aeiouy";
   return index;

}

理论上索引会更新到第一个元音所在的位置。

【问题讨论】:

    标签: java arrays string sorting


    【解决方案1】:

    这是您可以做到的一种方法:

    final static String vowels = "aeiouy";
    public static int indexOfFirstVowel(String word){
        String loweredWord = word.toLowerCase();
    
        for (int index = 0; index < loweredWord.length(); index++)
        {
            if (vowels.contains(String.valueOf(loweredWord.charAt(index))))
            {
                return index;
            }
        }
    
        // handle cases where a vowel is not found
        return -1;
    }
    

    这只是逐个字符地遍历单词,并检查每个字符以查看它是否存在于您的元音字符串中。

    【讨论】:

      【解决方案2】:

      为什么不在 ASCII 表中使用表示元音的掩码(未扩展)?

      这不是最简单的解决方案,但实际上非常快,因为它使用按位运算。

      如果没有找到元音,则返回-1

      public static int indexOfFirstVowel(String aString) {
          for (int i = 0; i < aString.length(); i++) {
              char c = aString.charAt(i);
      
              if ((c > 64) & ((0x110411101104111L & (1L << (c - 65))) > 0)) {
                  return i;
              }
          }
      
          return -1;
      }
      

      编辑:

      我忘记了扩展的 ASCII 表。

      替换:

      if ((c &gt; 64) &amp; ((0x110411101104111L &amp; (1L &lt;&lt; (c - 65))) &gt; 0))

      通过

      if ((c > 64) & (c <= 121) & ((0x110411101104111L & (1L << (c - 65))) > 0))
      

      其中 121 是 'y' 的 ascii 代码。

      【讨论】:

        【解决方案3】:

        您可以使用 charAt() 方法获取字符串的每个字符

        public static int englishVowelIndexOf(String word){
            char[] vowels = {'a','e','o','i','u','y'};
            String wordLowered =  word.toLowerCase();
            for (int i=0; i < wordLowered.length(); i++){
                for (int j=0; j < vowels.length(); j++) {
                   if (wordLowered.charAt(i) == vowels[j]){
                      return i;
                   }
                }
            }
            return -1;
        }
        

        【讨论】:

        • 不幸的是你有点太慢了
        • 将单词转换为小写以避免出现问题:word.toLowerCase().charAt(i)
        【解决方案4】:
        public static int indexOfFirstVowel(String word){
           int i;
            for(i=0; i<word.length();i++){  
             switch(word.charAt(i)){
                case 'a':
                case 'e':
                case 'i':
                case 'o':
                case 'u':
                case 'y':
                return i;
             }
            }
           return -1;
        }
        

        【讨论】:

        • 没有中断(这对于一些奇怪的逻辑来说可能不是问题)但是你还没有定义 i 在任何地方..
        • 检查一个字符串是否包含元音并不是一个奇怪的逻辑。
        • @johnabrhm 它需要的空间是检查字符是否包含在预先存在的字符串或 char[] 中的 12 倍。存在诸如 .contains() 之类的内置方法,以防止您必须执行此类操作。
        • @furkle 空间和时间总是权衡取舍。 en.wikipedia.org/wiki/Space%E2%80%93time_tradeoff
        • 这是一个奇怪的逻辑 index==-1 - 你可以在那里返回 i 并完全删除索引......另外,假设在内部它不像查找表,你会做 N 次比较 - 在​​其他实现中它会在找到'a'时停止..
        猜你喜欢
        • 2015-08-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-02
        • 1970-01-01
        • 2019-04-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多