当前位置: 首页 > 知识库问答 >
问题:

在Java中从字符串数组中查找第三大字符串

公冶光亮
2023-03-14

我的一个朋友问我关于他们的讲师作为练习给他们的一个编码挑战。我找到了一个解决办法。但我认为,对于一个简单的分类问题来说,这个解决方案太长了。所以,我想问一下,是否有更直接的方法来解决这个挑战。

具有函数third_greatest(),它接受一个字符串数组并返回第三大单词。因此,例如:如果数组是[“你好”、“世界”、“之前”、“中午”],则输出应该是“世界”,因为“之前”是六个字母长,“你好”和“世界”都是5个,但输出应该是“世界”,因为它显示为数组中最后一个五个字母的单词。如果数组是[“你好”、“世界”、“之后”、“中午”],则输出应该是“之后”,因为前三个单词都是五个字母长,所以返回最后一个。数组至少有三个字符串,每个字符串只包含字母。

我提出的解决方案使用HashMap以字典方式存储字符串。Hashmap将以整数和ArrayList的形式存储数据、长度和具有该长度的单词。一旦代码完成对字符串数组的迭代并将各个字符串放入各自的组中,我就从Hashmap中提取数组中找到的所有键(长度),并按升序对它们进行排序。之后,Hashmap的ArrayList中的所有值都将传输到另一个ArrayList。最后,它将新ArrayList的第三个字符串返回给函数调用方。

谢谢

import java.util.Arrays;
import java.util.ArrayList;
import java.util.HashMap;


class Main {
    public static void main (String args[]) {
        String test[] = {"hello", "world", "before", "noon"};
        System.out.println(third_greatest(test));
    }

    public static String third_greatest(String words[]) {
        HashMap<Integer, ArrayList<String>> words_length = new HashMap<Integer, ArrayList<String>>();
        for (String word : words) {
            int length = word.length();
            if (words_length.containsKey(length)) {
                words_length.get(length).add(word);
            } else {
                ArrayList<String> temp = new ArrayList<String>();
                temp.add(word);
                words_length.put(length, temp);
            }
        }
        Object keys[] = words_length.keySet().toArray();
        Integer sorted[] = new Integer[words_length.size()];
        for (int x = 0; x < keys.length; x++) {
            sorted[x] = (Integer)keys[x];
        }
        Arrays.sort(sorted);
        ArrayList<String> results = new ArrayList<String>();
        for (int x = sorted.length - 1; x >= 0; x--) {
            ArrayList<String> temp = words_length.get(sorted[x]);
            for (String word : temp) {
                results.add(word);
            }
        }
        return results.get(2);
    }
}

共有2个答案

白浩荡
2023-03-14

正如其他人所指出的,简单的解决方案是根据字符串大小(或任何排序标准)将数组排序。然后从排序后的列表中选取最后一个元素中的第三个。

这是一种解决方案,因为排序步骤是O(NlogN)。

这是一个O(N)的解决方案。

  • 从输入数组中提取前3个字符串并对其排序。这个由3个元素组成的数组将代表到目前为止输入数组的第三、第二和最大元素

最后,您将执行测试,最多执行3或4个元素数组的排序。总体复杂度为O(N)。

可以对排序步骤进行微观优化,以避免循环和不必要的数组创建和复制。

注意:如果输入列表总是很小,那么这种(更复杂的)解决方案不值得努力。当缩放变量的值较小时,具有更好的算法复杂性并不能保证更好的性能。

宰修能
2023-03-14

按流的长度降序排序,并跳过前2个元素。需要java 11

import java.util.*;

class ThirdLongest
{
    public static void main(String[] args) {
        String[] words={"Word","Longer Word","Longest Word Here"};
        
        String word=Arrays.stream(words)
            .sorted((s1,s2)->Integer.compare(s2.length(),s1.length()))
            .skip(2)
            .findFirst()
            .get();
                
       System.out.println(word);
    }
}

只需按降序排列数组并返回第三个元素

Arrays.sort(words,(s1,s2)->Integer.compare(s2.length(),s1.length()));

return words[2];
 类似资料:
  • 我有一个字符串“1,3,5,7,9,11,12,14”,我想检查该字符串在java中是否包含“12,3,14”。 我的代码:

  • 问题是,我试图这么做,但我检查字符串长度的方法不起作用;我能做些什么来修复它?

  • 问题内容: 我有一个字符串数组,其中包含字符串列表。我想弄清楚此列表中是否有重复的条目。基本上,我有一个用户列表,应该没有重复的条目。 问题答案: 您可以将String数组添加到HashSet 这将为您提供唯一的String值。如有必要,将HashSet转换回数组

  • 问题内容: 我正在寻找一种在字符串中查找JSON数据的方法。像wordpress简码一样思考它。我认为最好的方法是使用正则表达式。我不想解析JSON,只需查找所有出现的事件。 正则表达式中是否有办法使括号的数量匹配?目前,当我嵌套对象时遇到了这个问题。 演示的快速示例: 结果,我想要两个JSON字符串。谢谢! 问题答案: 从给定的文本中提取JSON字符串 由于您正在寻找一种简单的解决方案,因此可以

  • 问题内容: 给我们一个字符串,说一个子字符串,说。我需要找到字符串在原始字符串中第二次出现时的索引。 在这种情况下将返回2。在这种情况下,我希望输出为10。 问题答案: 使用的重载版本,它将起始索引(fromIndex)作为第二个参数:

  • 我们得到一个字符串,比如说< code >“it whatis”,以及一个子字符串,比如说< code >“is”。当字符串< code >“is”在原始字符串中第二次出现时,我需要找到< code >“I”的索引。 在这种情况下将返回2。我希望在这种情况下输出为10。