【问题标题】:Java method/function to return second shortest string from a list of stringsJava方法/函数从字符串列表中返回第二短的字符串
【发布时间】:2011-07-06 06:24:22
【问题描述】:

我需要有关 Java 程序的帮助,以便从字符串列表中找出第二短的字符串。

我可以就以下方面提出建议:

  • 如何开始?
  • 如何为此使用迭代器?
  • 解决此问题的有效方法是什么?

【问题讨论】:

  • 如果两个字符串长度相同会怎样?
  • “请给我一些关于如何开始的建议..”首先得到一个拼写检查器,然后像成年人一样拼写。

标签: java oop list collections


【解决方案1】:

您可以将Collections.sort 与一个比较器一起使用,该比较器根据两个字符串的长度进行比较。之后,您可以从排序后的集合中取出第二个元素。

注意:这不是最有效的方法,但只要性能不是问题,我建议使用可能可行的最简单的方法。

如果应考虑相等长度的字符串(即["a", "b", "cc"] 中第二短的字符串将是"cc"),那么您可以创建一个以字符串长度作为键和列表的哈希图该长度的字符串作为它们的值并取第二小的键的值。

【讨论】:

  • 很好的答案,因为 A) 这确实是最好的方法,而且 B) 在她试图让我们为她做的任何测试中,它都无助于桑迪。
  • 只是提到这是最简单但不是最有效的。它是O(NlogN),但任务可以在O(N) 中完成。
  • 另外,如果你有abcc,那么你应该把cc作为第二短。那么只拿第二个是不够的。你仍然需要循环。
  • @Petar Minchev 没错,但由于没有特别需要以最有效的方式进行操作,因此我更喜欢更简单的方法而不是更快的方法。我会在答案中提到它。
【解决方案2】:

维护两个变量最短的长度和次短的字符串的长度。所以让他们成为firstsecond

first = len(list[0]), second = len(list[0]);

for every other element cur do:
   curLen = len(cur);
   if (curLen < first):
      second = first;
      first = curLen;
   else
   if (curLen < second && curLen > first):
      second = cur;

我在这里假设您希望第二个最短的字符串具有与最短字符串不同的长度。如果您不想这样做,请删除 &amp;&amp; curLen &gt; first

您可以为实际字符串维护另外两个变量,或者只在列表中保留它们的索引。

【讨论】:

    【解决方案3】:

    遍历列表并保持前两个长度以及索引。

    例如:

    ab
    abc
    abcd
    a
    abcdef
    xyz
    

    遍历并得到顶部长度 = 6 和位置 = 4,第二个顶部长度 = 4,位置 = 3

    【讨论】:

      【解决方案4】:

      我会说:

      String[] loveLetters = {"Roses are red, ...", "I<3U", "I don't have time for a poem."};
      
      String[] shortest = {"",""}; //The shortest and the second shortest.
      
      for (int i=0;i<loveLetters.length;i++) {
        if (shortests[0].equals("") || loveLetters[i].length() < shortest[0].length()) {
          shortest[1] = shortest[0];
          shortest[0] = loveLetters[i];
        }
        else if (shortest[1].equals("") || loveLetters[i].length() < shortest[1].length()) {
          shortest[1] = loveLetters[i];
        }
      }
      System.out.println("What? The second shortest love letter you wrote me was: " + shortest[1] + "!!?! You should write more!");
      

      【讨论】:

        【解决方案5】:

        粗略的想法:

        1. 使用 for 循环遍历集合
        2. 使用两个局部变量(String actualShortestString, actualSecondShortestString,在循环外定义)来存储最短和第二短的字符串
        3. Math.min(actualString.length(), actualShortestString.length())帮助。
        4. 第二个最短的字符串是上一个最短的字符串

        注意 - 你被要求实现一个Select 算法来找到第k 个最小的元素Wikipedia 具有该任务的一些背景和算法。

        【讨论】:

          猜你喜欢
          • 2016-05-19
          • 2021-12-17
          • 1970-01-01
          • 1970-01-01
          • 2013-01-03
          • 2021-03-11
          • 2020-01-22
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多