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

时间:2012-03-16 18:31:01

标签: java

在接受采访时被问及:

  

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

     

例如

     

Str98 然后它应该返回 98

     

Str87uyuy232 - 它应该返回 87

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

if ((c >= '0') && (c <= '9'))

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

6 个答案:

答案 0 :(得分:39)

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

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

<子>(Thanks to Eric Mariacher

答案 1 :(得分:26)

使用java.util.Scanner

int res = new Scanner("Str87uyuy232").useDelimiter("\\D+").nextInt();

Scanner的目的是从输入中提取标记(此处为String)。标记是由分隔符分隔的字符序列。默认情况下,Scanner的分隔符是空格,因此标记是以空格分隔的单词。

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

如果没有要阅读的令牌,

nextInt()会抛出java.util.NoSuchElementException。在调用hasNextInt()之前调用方法nextInt(),检查是否有要阅读的内容。

答案 2 :(得分:16)

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

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

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

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

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

    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
    

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

答案 3 :(得分:6)

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

答案 4 :(得分:1)

以防您需要非正则表达式而不使用其他实用程序。

你去吧

public static Integer returnInteger(String s)
{
    if(s== null)
        return null;
    else
    {
        char[] characters = s.toCharArray();
        Integer value = null;
        boolean isPrevDigit = false;
        for(int i =0;i<characters.length;i++)
        {
            if(isPrevDigit == false)
            {
                if(Character.isDigit(characters[i]))
                {
                    isPrevDigit = true;
                    value = Character.getNumericValue(characters[i]);
                }
            }
            else
            {
                if(Character.isDigit(characters[i]))
                {   
                    value = (value*10)+ Character.getNumericValue(characters[i]);
                }
                else
                {
                    break;
                }
            }
        }
        return value;
    }
}

答案 5 :(得分:0)

你也可以去更低的水平。快速查看ASCII values显示字母字符从65开始。数字从48 - 57开始。在这种情况下,您可以简单地'和'n对127的字符,看看该值是否符合阈值,48 - 57.

    char[] s = "Str87uyuy232".toCharArray();
    String fint = "";
    Boolean foundNum = false;

    for (int i = 0; i < s.length; i++)
    {
        int test = s[i] & 127;
        if (test < 58 && test > 47)
        {
            fint += s[i];
            foundNum = true;
        }
        else if (foundNum)
            break;
    }
    System.out.println(fint);

这样做不会对现实世界(不同的角色集)有好处,但是作为拼图解决方案很有趣。