求职面试测试-查找出现在字符串中的两个字符中的第一个字符的索引

阿莫斯·波多维兹(Amos Bordowitz)

我刚刚进行了一次在线面试,被问到一个整洁的问题。以为我会与社区分享它以及我的答案。看看您是否认为我的答案正确,如果不正确,您将如何改进?我认为这可能会使像我这样的具有较短编码经验的人受益,他们尝试迈出第一步。

注意-该问题在正文中没有得到解释-必须自己解决功能。什么函数的作用是返回的第一个实例char achar b在给定String s或-1,如果不是没有发现。

问题

尽可能简化以下实现。如果您还可以通过简化来提高性能,那就更好了!仅供参考:该代码超过35行,包含300个令牌,但是可以用5行和少于60个令牌编写。

static int func(String s, char a, char b)
{
    if (s.isEmpty()) return -1;

    char[] strArray = s.toCharArray();

    int i=0;
    int aIndex=-1;
    int bIndex=-1;
    while (aIndex==-1 && bIndex==-1 && i<strArray.length)
    {
        if (strArray[i] == a)
            aIndex=i;
        if (strArray[i] == b)
            bIndex=i;
        i++;
    }


    if (aIndex != -1)
    {
        if (bIndex == -1)
            return aIndex;
        else
            return Math.min(aIndex, bIndex);
    }
    else
    {
        if (bIndex != -1)
            return bIndex;
        else
            return -1;
    }
}
飞行的

分析

给定的代码以这种方式工作:

  • 检查字符串是否为空=> return -1
  • 在以下情况下,while循环将停止:
    • a找到char的索引
    • b找到char的索引
    • 找到两个索引
    • 索引大于给定的String
  • 有三个可能的返回值
    • 如果找到a(或a和b)=> return aIndex
    • 如果找到b => return bIndex
    • 如果什么也没找到=> return -1

解决方案

在我看来,没有人想到最简单,最快的解决方案。每个其他人都调用indexOf两次,因此在String上迭代两次。

public int func(String s, char a, char b) {
  for (int i = 0; i < s.length(); i++) {
    char c = s.charAt(i);
    if (c == a || c == b) {
      return i;
    }
  }
  return -1;
}

基准结果

设置

char'x''z'恰好位于String的中间。测试字符串包含10000个字符。

import java.util.concurrent.TimeUnit;

import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.BenchmarkMode;
import org.openjdk.jmh.annotations.Fork;
import org.openjdk.jmh.annotations.Measurement;
import org.openjdk.jmh.annotations.Mode;
import org.openjdk.jmh.annotations.OutputTimeUnit;
import org.openjdk.jmh.annotations.Scope;
import org.openjdk.jmh.annotations.State;
import org.openjdk.jmh.annotations.Threads;
import org.openjdk.jmh.annotations.Warmup;

@Fork(3)
@BenchmarkMode(Mode.AverageTime)
@Measurement(iterations = 10, timeUnit = TimeUnit.NANOSECONDS)
@State(Scope.Benchmark)
@Threads(1)
@Warmup(iterations = 5, timeUnit = TimeUnit.NANOSECONDS)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
public class MyBenchmark {

  String s = "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. \r\n"
      + "\r\n"
      + "Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. \r\n"
      + "\r\n"
      + "Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. \r\n"
      + "\r\n"
      + "Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. \r\n"
      + "\r\n"
      + "Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. \r\n"
      + "\r\n"
      + "At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. \r\n"
      + "\r\n"
      + "Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. \r\n"
      + "\r\n"
      + "Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. \r\n"
      + "\r\n"
      + "Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. \r\n"
      + "\r\n"
      + "Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. \r\n"
      + "\r\n"
      + "Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. \r\n"
      + "\r\n"
      + "At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. \r\n"
      + "\r\n"
      + "Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. \r\n"
      + "\r\n"
      + "Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. \r\n"
      + "\r\n"
      + "Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. \r\n"
      + "\r\n"
      + "Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. \r\n"
      + "\r\n" + "Duis au";

  char a = 'x';
  char b = 'z';

  @Benchmark
  public int testLong() {
    if (s.isEmpty()) {
      return -1;
    }

    char[] strArray = s.toCharArray();

    int i = 0;
    int aIndex = -1;
    int bIndex = -1;
    while (aIndex == -1 && bIndex == -1 && i < strArray.length) {
      if (strArray[i] == a) {
        aIndex = i;
      }
      if (strArray[i] == b) {
        bIndex = i;
      }
      i++;
    }

    if (aIndex != -1) {
      if (bIndex == -1) {
        return aIndex;
      } else {
        return Math.min(aIndex, bIndex);
      }
    } else {
      if (bIndex != -1) {
        return bIndex;
      } else {
        return -1;
      }
    }
  }

  @Benchmark
  public int testIndexOf1() {
    return Math.max(s.indexOf(a), s.indexOf(b));
  }

  @Benchmark
  public int testSubstring() {
    return func(s, a, b);
  }

  private int func(String s, char a, char b) {
    if (s.length() <= 0) {
      return -1;
    } else if (s.charAt(0) == a || s.charAt(0) == b) {
      return 0;
    } else {
      int r = func(s.substring(1), a, b);
      return r < 0 ? -1 : r + 1;
    }
  }

  @Benchmark
  public int testLoop() {
    for (int i = 0; i < s.length(); i++) {
      char c = s.charAt(i);
      if (c == a || c == b) {
        return i;
      }
    }
    return -1;
  }
}

结果

Benchmark                  Mode  Cnt        Score        Error  Units
MyBenchmark.testIndexOf1   avgt   30      949,729 ±     14,753  ns/op
MyBenchmark.testLong       avgt   30     4044,216 ±    122,244  ns/op
MyBenchmark.testLoop       avgt   30      725,502 ±     38,688  ns/op
MyBenchmark.testSubstring  avgt   30  3549335,410 ± 133681,449  ns/op

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何测试两个字符串是否同时出现在另一个字符串中?

来自分类Dev

如何测试两个字符串是否同时出现在另一个字符串中?

来自分类Dev

找到两个字符串的交集,其中返回出现在两个字符串中的字符(与第一个字符串相同的序列顺序)

来自分类Dev

如何使用IF针对一个变量测试两个字符串

来自分类Dev

如何使用IF针对一个变量测试两个字符串

来自分类常见问题

如何测试字符串是否在PHPUnit中包含另一个字符串?

来自分类Dev

Anagram测试python中的两个字符串

来自分类Dev

从第二个字符串中删除出现在第一个字符串中的字符

来自分类Dev

从第二个字符串中删除出现在第一个字符串中的字符

来自分类Dev

Bash Shell测试一个字符串中的所有字符是否在另一个字符串中

来自分类Dev

使用awk测试第一个字符是否为数字

来自分类Dev

如何测试一个字符串是否是另一个字符串的子序列?

来自分类Dev

如何测试一个字符串是否是另一个字符串的子序列?

来自分类Dev

如何在文件的不同行中测试另一个字符串之前是否存在一个字符串

来自分类Dev

将两个字符串中的每个字符串的所有第一个类似的字符放入另一个字符串中

来自分类Dev

测试一个字符串是否只有一个字符,中间的REGEX是否带有空格

来自分类Dev

TryParse 一个字符串,然后测试它的值

来自分类Dev

给定两个字符串的长度,测试两个字符串是否相同

来自分类Dev

网站的JUnit测试包含一个字符串或(专有)其他字符串

来自分类Dev

用银杏麻烦测试两个字符串

来自分类Dev

如何测试两个字符串是否彼此旋转?

来自分类Dev

F#:测试两个字符串是否为字谜

来自分类Dev

两个字符串打印相同但没有通过相等测试?

来自分类Dev

在作为字母的字符串中查找第一个字符

来自分类Dev

查找数组字符串中的第一个字符

来自分类Dev

Python - 根据后一个字符串的最后一次出现在两个字符串之间找到一个子字符串

来自分类Dev

返回一个不带前两个字符的字符串,但如果第一个字符为“ a”则例外

来自分类Dev

连接两个字符串,其中第一个字符串在末尾有一个空格

来自分类Dev

编写一个静态方法,该方法接受两个字符串并返回一个布尔值,说明第一个字符串是否在第二个字符串中作为子字符串出现

Related 相关文章

  1. 1

    如何测试两个字符串是否同时出现在另一个字符串中?

  2. 2

    如何测试两个字符串是否同时出现在另一个字符串中?

  3. 3

    找到两个字符串的交集,其中返回出现在两个字符串中的字符(与第一个字符串相同的序列顺序)

  4. 4

    如何使用IF针对一个变量测试两个字符串

  5. 5

    如何使用IF针对一个变量测试两个字符串

  6. 6

    如何测试字符串是否在PHPUnit中包含另一个字符串?

  7. 7

    Anagram测试python中的两个字符串

  8. 8

    从第二个字符串中删除出现在第一个字符串中的字符

  9. 9

    从第二个字符串中删除出现在第一个字符串中的字符

  10. 10

    Bash Shell测试一个字符串中的所有字符是否在另一个字符串中

  11. 11

    使用awk测试第一个字符是否为数字

  12. 12

    如何测试一个字符串是否是另一个字符串的子序列?

  13. 13

    如何测试一个字符串是否是另一个字符串的子序列?

  14. 14

    如何在文件的不同行中测试另一个字符串之前是否存在一个字符串

  15. 15

    将两个字符串中的每个字符串的所有第一个类似的字符放入另一个字符串中

  16. 16

    测试一个字符串是否只有一个字符,中间的REGEX是否带有空格

  17. 17

    TryParse 一个字符串,然后测试它的值

  18. 18

    给定两个字符串的长度,测试两个字符串是否相同

  19. 19

    网站的JUnit测试包含一个字符串或(专有)其他字符串

  20. 20

    用银杏麻烦测试两个字符串

  21. 21

    如何测试两个字符串是否彼此旋转?

  22. 22

    F#:测试两个字符串是否为字谜

  23. 23

    两个字符串打印相同但没有通过相等测试?

  24. 24

    在作为字母的字符串中查找第一个字符

  25. 25

    查找数组字符串中的第一个字符

  26. 26

    Python - 根据后一个字符串的最后一次出现在两个字符串之间找到一个子字符串

  27. 27

    返回一个不带前两个字符的字符串,但如果第一个字符为“ a”则例外

  28. 28

    连接两个字符串,其中第一个字符串在末尾有一个空格

  29. 29

    编写一个静态方法,该方法接受两个字符串并返回一个布尔值,说明第一个字符串是否在第二个字符串中作为子字符串出现

热门标签

归档