【问题标题】:Algorithm to parse strings up to and including number解析字符串的算法,包括数字
【发布时间】:2020-05-14 15:51:20
【问题描述】:

这是我最近参加的编码挑战面试中的一个问题。我想出了一个 hacky 解决方案,但我相信还有更好的方法。

其中一个要求是找到一组包含该数字的字符串。数字后面的字母表示主要组的子集。以下字符串中的组将是字符串“ford1”、“ford333”、“ford4”、“ford2”

字符串代码 = "ford1, ford333, ford4, ford4a, ford4b, ford1a, ford2, ford333a";

请注意,一旦字符串被解析,您就不能对其进行排序。


输入规范: 输入由单个字符串组成,其中包含逗号分隔的子字符串。每个子字符串都以一个或多个字母开头,后跟一个或多个数字,然后是零个或多个字母。这是一个示例输入:

String codes = "ford1, ford333, ford4, ford4a, ford4b, ford1a, ford2, ford333a";

规则:算法必须找到每个数字后没有字母的子字符串。

输出规范: 输出应为符合规则的子串列表。输出不需要按排序顺序。该示例的输出是:

"ford1", "ford333", "ford4", "ford2"

【问题讨论】:

  • 您的问题是什么?请看How to ask
  • 问题是如何解析字符串。我给出了输入和预期输出。
  • 我试图澄清算法的描述,但一个好的算法问题也应该显示你的代码。据我们所知,您已经拥有了最好的算法。但也许有人可以教你如何打磨代码,这样虽然算法不变,但代码看起来更干净。
  • @vivek_23 对不起,伙计。不是故意不理你的。

标签: java algorithm


【解决方案1】:

你可以使用正则表达式。

String codes = "ford1, ford333, ford4, ford4a, ford4b, ford1a, ford2, ford333a";

Pattern pat = Pattern.compile("([a-z]+[0-9]+)(,|$)");

Matcher m = pat.matcher(codes);
while(m.find())
    System.out.println(m.group(1));

输出:

ford1
ford333
ford4
ford2

如果您不喜欢对逗号位置的依赖,那么这种模式似乎也可以工作

([a-z]+[0-9]++)([^a-z]|$)

【讨论】:

  • 光滑。您能否解释一下表达式“(,|$)”的这一部分。我可以看到它对结果进行了分组。我只是不确定这种角色组合是如何完成任务的。
  • 我只能猜测第一个“命令”是寻找昏迷,然后与$分组。
  • 第一组 ([a-z]+[0-9]+) 匹配一个由 1 个或多个字符后跟 1 个或多个数字组成的字符串。我们在输出中忽略的第二个捕获组 (,|$) 指定下一个字符必须是逗号或 ('|') 字符串结尾 ('$')。
【解决方案2】:

这个问题不是很清楚。顺便说一句,你的解决方案是什么?将其发布在问题中会有所帮助。

根据我的理解,您想在最后一位数字之后对没有字母的代码进行分组。如果这是正确的,那么这是我能想到的处理它的基本代码。

    String codes = "ford1, ford333, ford4, ford4a, ford4b, ford1a, ford2, ford333a";
    String[] codeArr = codes.split(",");
    List<String> group = new ArrayList<>();
    for(String code : codeArr) {
        code = code.trim();
        for(int i=0; i<code.length(); i++) {
            // Skip over all non digit char
            while(i<code.length() && !Character.isDigit(code.charAt(i)))
                i++;

            // reached a digit. Skip over all digits
            while(i<code.length() && Character.isDigit(code.charAt(i)))
                i++;

            if(i == code.length())
                // reached end of code i.e. no letter after the digits
                group.add(code);
        }
    }

如果这不是预期的结果,请进一步澄清您的问题并添加您的 hacky 代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-09
    • 1970-01-01
    • 2013-06-12
    • 1970-01-01
    • 1970-01-01
    • 2015-08-25
    • 2021-11-18
    • 2012-02-20
    相关资源
    最近更新 更多