给定一个字符串找到第一个嵌入的整数

gmh*_*mhk 31 java

这在接受采访时被问到:

在任何字符串中给出,让我第一次出现整数.

例如

Str98然后应该返回98

Str87uyuy232 - 它应该返回87

我把答案作为循环遍历字符串并将其与数字字符进行比较,如

if ((c >= '0') && (c <= '9'))
Run Code Online (Sandbox Code Playgroud)

然后我得到了数字的索引,解析它并返回它.不知怎的,他不相信.任何人都可以分享最好的解决方案吗?

cde*_*zaq 43

使用正则表达式,它非常简单:

String s = new String("Str87uyuy232");
Matcher matcher = Pattern.compile("\\d+").matcher(s);
matcher.find();
int i = Integer.valueOf(matcher.group());
Run Code Online (Sandbox Code Playgroud)

(感谢Eric Mariacher)

  • 什么是`new String`? (3认同)

bar*_*jak 27

使用java.util.Scanner:

int res = new Scanner("Str87uyuy232").useDelimiter("\\D+").nextInt();
Run Code Online (Sandbox Code Playgroud)

a的目的Scanner是从输入(这里,a String)中提取令牌.标记是由分隔符分隔的字符序列.默认情况下,a的分隔符Scanner是空格,因此标记是以空格分隔的单词.

在这里,我使用分隔符\D+,这意味着"任何不是数字的东西".我们Scanner可以在字符串中读取的标记是"87"和"232".该nextInt()方法将读取第一个.

nextInt()java.util.NoSuchElementException如果没有令牌要读,则抛出.hasNextInt()在调用之前调用方法nextInt(),以检查是否有要读取的内容.


mfr*_*kli 16

此解决方案存在两个问题.

  1. 考虑测试用例 - 有2个字符'8'和'7',它们都形成你应该返回的整数87.(这是主要问题)

  2. 这有点迂腐,但字符'0'的整数值不一定小于'1','2'等的值.它可能几乎总是如此,但我想访调员喜欢看到这种关心.一个更好的解决方案是

    if(Character.isDigit(c)){...}

有很多不同的方法可以做到这一点.我的第一个想法是:

int i = 0;
while (i < string.length() && !Character.isDigit(string.charAt(i))) i++;
int j = i;
while (j < string.length() && Character.isDigit(string.charAt(j))) j++;
return Integer.parseInt(string.substring(i, j)); // might be an off-by-1 here
Run Code Online (Sandbox Code Playgroud)

当然,正如评论中所提到的,在Java中使用正则表达式功能可能是最好的方法.但是当然很多面试官要求你做这样的事情没有图书馆等...

  • @Danny - 在可维护性方面,RegEx解决方案的代码要少得多,特别是对于像这样的简单情况.通常,RegEx在编译模式时受到的打击最大,而在实际解析时则不然.因为我很喜欢拥有更简单(即更容易维护)的代码,直到我可以证明我从中获得了所需的速度增加(即使用分析器),并且通过更改它可以获得足够大的速度提升. (2认同)

Mat*_*att 6

String input = "Str87uyuy232";
Matcher m = Pattern.compile("[^0-9]*([0-9]+).*").matcher(input);
if (m.matches()) {
    System.out.println(m.group(1));
}
Run Code Online (Sandbox Code Playgroud)