Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 比较字符串及其缩写的有效性_Java_String_Algorithm_String Matching - Fatal编程技术网

Java 比较字符串及其缩写的有效性

Java 比较字符串及其缩写的有效性,java,string,algorithm,string-matching,Java,String,Algorithm,String Matching,这个问题是在一次求职面试中向我提出的,我认为这很好,因为有几种方法可以解决它 说明如下: “国际化”等字符串的长度为20个字符。信息技术 可以缩写为“i18n”,读作“i-跳过18个字符-n” 类似地,也接受其他缩写,如“i16ion”、“internationali2tion”甚至“20” 要跳过的数字可以是任何正整数(无0,无负 并且该字符串可能包含多个跳过事件- 例如,“int3ationa2za1ion”也是可以接受的 原始字符串不包含数字-因此缩写字符串中的每个数字都表示跳过 缩写字

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

说明如下:

  • “国际化”等字符串的长度为20个字符。信息技术 可以缩写为“i18n”,读作“i-跳过18个字符-n”
  • 类似地,也接受其他缩写,如“i16ion”、“internationali2tion”甚至“20”

  • 要跳过的数字可以是任何正整数(无0,无负 并且该字符串可能包含多个跳过事件- 例如,“int3ationa2za1ion”也是可以接受的

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

  • 缩写字符串也可以以skip开头或结尾,例如“6ationalizati2” 例如

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

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

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

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。

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

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。

我想您不想知道这可以在一行代码中完成吗?如果我以后有时间,我会发布一个答案。如果面试官给我这个签名,我会说我认为
equals
是一个糟糕的方法名称选择。这与相等的概念根本不匹配,因为您可能有两个与相同的
abbr
相同但彼此不相等的
orig
字符串
isabreviation for
isvalidabreviation
会更好。@ajb-fiar足够了。虽然我不想在这种情况下纠正我的面试官,但我认为向面试官指出这一点是完全正确的。它显示了对所涉及概念的更深入的理解,而不仅仅是盲目地遵循说明。好吧,我需要仔细检查细节并编写一些解释,但它类似于
return orig.matches(缩写为replaceAll(([1-9][0-9]*),“\\w{$1}”)我想你不想知道这可以在一行代码中完成?如果我以后有时间,我会发布一个答案。如果面试官给我这个签名,我会说我认为
equals
是一个糟糕的方法名称选择。这与相等的概念根本不匹配,因为您可能有两个与相同的
abbr
相同但彼此不相等的
orig
字符串
isabreviation for
isvalidabreviation
会更好。@ajb-fiar足够了。虽然我不想在这种情况下纠正我的面试官,但我认为向面试官指出这一点是完全正确的。它显示了对所涉及概念的更深入的理解,而不仅仅是盲目地遵循说明。好吧,我需要仔细检查细节并编写一些解释,但它类似于
return orig.matches(缩写为replaceAll(([1-9][0-9]*),“\\w{$1}”)为什么不?这是一个奇妙的答案。显然,这是做好面试问题的关键:将给出30行答案的编码员与给出1行答案的编码员分开:)这或多或少是Dawood ibn Kareem的建议,不是吗?@m69是的,但少而不是多(我没有读评论)很酷。我之所以选你,是因为你帮我省去了为自己写这本书的麻烦(我真的打算这么做)。这正是regexp所擅长的,因此知道这一点以及如何做到这一点表明我对现代Java运行时库中更晦涩的部分非常熟悉。为什么不呢?这是一个奇妙的答案。显然,这是做好面试问题的关键:将给出30行答案的编码员与给出1行答案的编码员分开:)这或多或少是Dawood ibn Kareem的建议,不是吗?@m69是的,但少而不是多(我没有读评论)很酷。我之所以选你,是因为你帮我省去了为自己编写它的麻烦(我真的打算这么做)。这正是regexp所擅长的,因此知道这一点以及如何做到这一点表明我对现代Java运行时库中更晦涩的部分非常熟悉。