java - Job interview test - finding the index of the first of two chars to appear in a string -


i had online interview , asked neat question. thought share community, along answer. see if think answer correct , if not - how improve on it? think benefit people me relatively short coding experience, trying make first steps.

note - problem did not have explanation in body - had figure out functionality on own. function return the first instance of char a or char b in given string s or -1 if either not found.

problem

simplify implementation below as can. better if can improve performance part of simplification! fyi: code on 35 lines , on 300 tokens, can written in 5 lines , in less 60 tokens.

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;     } } 

analysis

the given code works way:

  • check if string empty => return -1
  • while loop stops if:
    • the index of char a found
    • the index of char b found
    • both indices found
    • the index larger given string
  • there 3 possible return values
    • if (or , b) found => return aindex
    • if b found => return bindex
    • if nothing found => return -1

solution

no 1 thinking of simplest , in opinion fastest solution. every 1 else calling indexof twice , therefore iterating twice on string.

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

benchmark results

setup

the char 'x' , 'z' quite in middle of string. test string contains 10000 chars.

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. @ 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. @ 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. @ 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 @ 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 @ 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. @ 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, @ 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. @ 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. @ 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. @ 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. @ 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. @ 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. @ 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 @ 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 @ 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. @ 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, @ 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. @ 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. @ 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. @ 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. @ 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. @ 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. @ 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 @ 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 @ 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 = 'x';   char b = 'z';    @benchmark   public int testlong() {     if (s.isempty()) {       return -1;     }      char[] strarray = s.tochararray();      int = 0;     int aindex = -1;     int bindex = -1;     while (aindex == -1 && bindex == -1 && < 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) == || 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() {     (int = 0; < s.length(); i++) {       char c = s.charat(i);       if (c == || c == b) {         return i;       }     }     return -1;   } } 

results

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 

Comments

Popular posts from this blog

java - Date formats difference between yyyy-MM-dd'T'HH:mm:ss and yyyy-MM-dd'T'HH:mm:ssXXX -

c# - Get rid of xmlns attribute when adding node to existing xml -