【问题标题】:Comparing a string and its abbreviation for validity比较字符串及其缩写的有效性
【发布时间】:2017-10-29 22:31:28
【问题描述】:

这个问题是在一次求职面试中提出的,我认为这很好,因为有几种方法可以解决它。

说明如下:

  • 诸如“internationalization”之类的字符串长度为 20 个字符。它 可以缩写为“i18n”,读作“i - skip 18 characters - n”。
  • 同样,其他缩写如“i16ion”、“internationali2tion”甚至“20”也可以接受。

  • 要跳过的数字可以是任何正整数(没有 0,没有负数 数字),并且字符串可能包含不止一个跳过事件 - 例如,“int3ationa2za1ion”也是可以接受的。

  • 原始字符串不包含数字 - 因此缩写字符串中的每个数字都代表一个跳过。

  • 缩写字符串也可以以跳过开头或结尾 - “6ationalizati2”,例如 例子。

给定两个字符串 - 一个代表原始字符串,另一个代表缩写,确定缩写字符串是否有效。执行此操作的方法必须实现签名

public static boolean equals (String orig, String abbr);

【问题讨论】:

  • 我想你不想知道这可以在一行代码中完成吗?以后有时间我会回复的。
  • 如果面试官给我这个签名,我会说我认为equals是一个糟糕的方法名称选择。这根本不符合相等的概念,因为您可以有两个 orig 字符串“相等 [不是真的]”到相同的 abbr,但彼此不相等。 isAbbreviationForisValidAbbreviation 会更好。
  • @ajb - 够狠。虽然我不想在这种情况下纠正我的面试官。
  • @Assafs 我认为向面试官指出这一点是完全正确的。它显示了对所涉及概念的更深入理解,而不仅仅是盲目地遵循说明。
  • 好吧,我需要仔细检查细节并写一些解释,但它类似于return orig.matches(abbr.replaceAll("([1-9][0-9]*)", "\\w{$1}"));

标签: java string algorithm string-matching


【解决方案1】:

我真的不应该回答这个问题,因为你没有展示你的代码,但我无法抗拒,因为代码太酷了:

public static boolean equals (String orig, String abbr) {
    return orig.matches(abbr.replaceAll("\\d+", ".{$0}"));
}

这是通过将所有数字转换为它们的正则表达式,相当于带量词的点,例如:

"i16ion" -> "i.{16}ion"

\d+ 表示“一个或多个数字(贪婪)”,$0 是对整个匹配项的反向引用。

仅供参考 java 的 String.matches() 方法必须匹配 整个 字符串,因此您甚至不需要在许多其他语言中返回 true 的前导 ^ 或尾随 $仅匹配字符串的 部分

【讨论】:

  • 为什么不呢?这是一个很棒的答案。显然,这是解决好工作面试问题的关键:将给出 30 行答案的编码人员与给出 1 行答案的编码人员区分开来:)
  • 这或多或少是 Dawood ibn Kareem 的建议,不是吗?
  • @m69 是的,但少而不是多(我没有读过 cmets)
  • 酷。我支持你是因为你省去了我自己写的麻烦(我真的打算这样做)。
  • 这正是正则表达式擅长的领域,因此了解这一点以及如何实现这一点表明您熟悉现代 Java 运行时库中较为晦涩的部分。
猜你喜欢
  • 1970-01-01
  • 2011-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-01
  • 1970-01-01
相关资源
最近更新 更多