这在接受采访时被问到:
在任何字符串中给出,让我第一次出现整数.
例如
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)
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
此解决方案存在两个问题.
考虑测试用例 - 有2个字符'8'和'7',它们都形成你应该返回的整数87.(这是主要问题)
这有点迂腐,但字符'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中使用正则表达式功能可能是最好的方法.但是当然很多面试官要求你做这样的事情没有图书馆等...
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)
归档时间: |
|
查看次数: |
54893 次 |
最近记录: |