【问题标题】:Method to the lowest letter (in alphabetical order) in a string字符串中最小字母(按字母顺序)的方法
【发布时间】:2014-06-13 06:26:08
【问题描述】:

我正在尝试编写一个简单的方法,它接受一个字符串并返回该字符串的最小字母。例如,给定字符串“basic”,应返回“a”。

这是我想出的代码。目前我收到了 OutOfMemoryError。您还会注意到我尝试使用递归,但我也愿意接受不使用递归的建议。

public static String smallestLetter(String str) {
        if (str.length() == 1)
            return str.substring(0);
        else if (str.charAt(0) < str.charAt(1))
            return smallestLetter(str.substring(0) + str.substring(2,str.length()));
        else
            return smallestLetter(str.substring(1,str.length()));
}

请告诉我哪里出了问题以及我可以做些什么来解决它。谢谢!

【问题讨论】:

  • 为什么要使用递归呢?只需迭代并保留对最小值的引用。
  • 你需要阅读substring的javadoc。 substring(0) 不会像你想的那样做。

标签: java string if-statement recursion methods


【解决方案1】:

问题出在这一行:

        return smallestLetter(str.substring(0) + str.substring(2,str.length()));

str.substring(0) 实际上是整个字符串;因此,在这一行中,该方法使用几乎是原始字符串的两倍大的字符串重新调用自身。只需几个方法调用,您就可以拥有一个比您可以分配的更大的字符串。

最小的修复是:

        return smallestLetter(str.charAt(0) + str.substring(2,str.length()));

但更好的解决方法是使用迭代而不是递归:

public static String smallestLetter(String str) {
    char ret = str.charAt(0);
    for (int i = 1; i < str.length(); ++i)
        if (str.charAt(i) < ret)
            ret = str.charAt(i);
    return String.valueOf(ret);
}

编辑添加:请注意,正如Alexey Malev 在下面指出的那样,如果str 是空字符串(""),这将引发异常。另外,它不做任何过滤来专门识别字母;相反,它会返回字符串中最小的字符,无论它是否是一个字母。

【讨论】:

  • 不应该是if (str.charAt(i) &lt; ret)吗?
  • @GoldRoger:应该是,现在是。谢谢! :-)
  • 该代码返回第一个字母,这可能导致零长度字符串的OutOfBounds。另一个问题 - 字符串可能不包含字母,在这种情况下,您将返回可能不是所需结果的第一个字符。
  • @AlexeyMalev:回复:第一个问题:正确。此方法为零长度字符串抛出异常。 OP 的代码也是如此,所以我认为这是可以接受的行为。回复:第二个问题:这段代码没有尝试通过实际的“字母”进行过滤,因为 OP 的代码没有,我不确定它是否真的应该这样做。 (OP 可能意味着“字符”,或者可能根本不关心包含非字母的字符串的行为。)
  • @ruakh 你的说法很有道理,我写它只是为了让 OP 意识到这些。
【解决方案2】:

我认为您的代码过于深入递归,有时堆内存已经结束。

如果我们假设您只需要查找拉丁字母,我会这样做:

public static String smallestLetter(String str) {
    for (Character ch = 'a'; ch <= 'z'; ++ch) {
        if (str.contains(String.valueOf(ch))) {
            return String.valueOf(ch);
        }
    }
    return "No characters in the string :(";
}    

【讨论】:

    【解决方案3】:

    试试这个:

    char min = s.charAt(0);
    for (int i = 0; i < s.length(); i++)
        if (Character.isLetter(s.charAt(i)) && s.charAt(i) < min)
            min = s.charAt(i);
    return min;
    

    【讨论】:

      猜你喜欢
      • 2014-08-05
      • 1970-01-01
      • 2022-01-02
      • 2016-04-21
      • 1970-01-01
      • 2017-10-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多