【问题标题】:Get a list of strings that contain a specified character from an array of string从字符串数组中获取包含指定字符的字符串列表
【发布时间】:2014-10-06 23:03:09
【问题描述】:

我刚面试,面试官问了我以下问题:

从一个字符串(英文单词)数组中,编写一个函数,返回所有包含一个字符的单词。

我最初提出了类似的建议:

public static List<String> find(String[] array, char c) {
     if(null ==  array || array.length == 0)
          return null;

     List<String> res = new ArrayList<String>();
     for(String s : array) {
          if(s.indexOf(c) > -1) {
               res.add(s);
          }
     }
     return res;
}

然后,面试官问我优化我的解决方案,可以使用什么样的数据结构。 (她说我的解决方案是蛮力)

我仍然不知道如何优化它。有任何想法吗?

【问题讨论】:

  • 你能在字符上使用 contains 吗?不是 indexOf 吗?
  • @Leo 你是对的,我的错。
  • np。但包含不会使其暴力。我也很想知道这个问题的答案。她希望你使用索引吗? :-)
  • 我唯一的评论是我宁愿看到一个空数组返回而不是 null。但那是tbh的意见。我看不出如何改进
  • @saadtaame 使用 java 8 你可以在一行中完成(即更少的代码),但这只是一个“编码”优化假设“更少的代码”是可取的(我同意)。执行速度虽然相似。我认为 Lashane 的答案可能是她想要的,但这可能被认为是“糟糕的编码”,因为它是正确行为所不需要的优化,而且问题中没有任何内容表明这种方法会在具有不同搜索字符的相同字符串数组。如果这是要求,面试官应该明确说明。

标签: java string algorithm


【解决方案1】:

你不能进一步优化这个功能,但我想面试官想听这样的话:

如果我们需要在同一个数组上多次执行这个操作,我们可以使用下面的类(用伪代码编写):

class FastStringArrayContainsChar {
    private Map<Char, Set<String>> index = new HashMap<Char, Set<String>>();
    public FastStringArrayContainsChar(String[] input) {
        for (String s: input) {
            for (int i=0; i<s.length; s++) {
                char c = s.charAt(i);
                if (index.contains(c))
                    index.get(c).put(s);
                else
                    index.put(c, new HashSet<String>(){{this.put(s);}});
            }
        }
    }
    public List<String> containsChar(char c) {
        return new ArrayList<String>(index.get(c));
    }
}

【讨论】:

  • 面试官没有提供任何背景信息,我可能应该问...但是您的回答非常有道理。谢谢。
【解决方案2】:

要检查ith 字符串是否包含字符c,请逐个字母检查并在找到后返回。

boolean check(String s, char c)
{   for(int i = 0, n = s.length(); i < n; i++)
       if(s[i] == c)
          return true;
    return false;
}

这不会改变最坏情况的时间,但在实践中可能会运行得很快。除此之外,我看不出如何进一步改进代码(我假设没有提供有关数组中单词的其他信息)。

【讨论】:

  • 这不是 indexOf() 在做什么吗?
【解决方案3】:

也许输入数组包含重复项。虽然它使用了更多的内存

public static List<String> find(String[] array, char c) {
     if(array == null || array.length == 0) {
        return null;
     }
     Map<String, Boolean> map = new HashMap<String, Boolean>();
     List<String> res = new ArrayList<String>();
     for(String s : array) {
        if (map.containsKey(s)) {
            if (map.get(s)) {
                res.add(s);
            }
        } else {
            if(s.indexOf(c) > -1) {
                 map.put(s, true);
                 res.add(s);
            } else {
                map.put(s, false);
            }
        }

     }
     return res;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-24
    • 1970-01-01
    • 2015-01-20
    • 2020-08-26
    • 1970-01-01
    • 1970-01-01
    • 2017-10-19
    • 2012-01-12
    相关资源
    最近更新 更多