Вопрос:

Реализуйте atoi, который преобразует строку в целое число.

Сначала функция отбрасывает столько пробельных символов, сколько необходимо, пока не будет найден первый непробельный символ. Затем, начиная с этого символа, принимает необязательный начальный знак плюс или минус, за которым следует как можно больше числовых цифр, и интерпретирует их как числовое значение.

Строка может содержать дополнительные символы после тех, которые образуют целое число, которые игнорируются и не влияют на поведение этой функции.

Если первая последовательность символов, отличных от пробелов, в строке str не является допустимым целым числом или если такой последовательности не существует, поскольку либо строка str пуста, либо содержит только символы пробелов, преобразование не выполняется.

Если невозможно выполнить допустимое преобразование, возвращается нулевое значение.

Примечание.

  • Только символ пробела ' ' считается символом пробела.
  • Предположим, что мы имеем дело со средой, которая может хранить целые числа только в диапазоне 32-битных целых чисел со знаком: [−231, 231 − 1]. Если числовое значение выходит за пределы диапазона представляемых значений, возвращается INT_MAX (231 - 1) или INT_MIN (-231).

Подход 1:

Вот очень наивный подход, который имеет много возможностей для улучшения —

//Approach 1
//Runtime: 16ms
//Memory usage: 38.5MB
public int myAtoi(String str) {
 char[] characters = str.toCharArray();
 int startIndex = firstNonWhiteSpace(characters);
 int sign = 1;
 if(startIndex==-1 || characters[startIndex]==’+’){
 startIndex++;
 } else if(characters[startIndex]==’-’) {
 startIndex++;
 sign = -1;
 }
 
 int endIndex = getEndOfFirstIntegerPart(characters, startIndex);
 String numberString = str.substring(startIndex, endIndex);
 try {
 return Integer.valueOf(numberString) * sign;
 } catch(NumberFormatException nfe) {
 if(“”.equals(numberString)){
 return 0;
 }else if(sign==1) {
 return Integer.MAX_VALUE;
 } else {
 return Integer.MIN_VALUE;
 }
 } catch (Exception e) {
 return 0;
 }
 }
 
 private int firstNonWhiteSpace(char[] characters) {
 int index = 0;
 while(index<characters.length && characters[index++]==’ ‘);
 return index-1;
 }
 
 private int getEndOfFirstIntegerPart(char[] characters, int start) {
 for(int index = start;index<characters.length; index++) {
 switch (characters[index]) {
 case ‘0’:
 case ‘1’:
 case ‘2’:
 case ‘3’:
 case ‘4’:
 case ‘5’:
 case ‘6’:
 case ‘7’:
 case ‘8’:
 case ‘9’:
 break;
 default:
 return index;
 }
 }
 return characters.length;
 }

Что ж, код работает. Тем не менее, похоже, предстоит пройти долгий путь. Здесь — это другой подход, который вы, возможно, захотите проверить. А вот еще один с меньшим временем выполнения.

Больше постов ищите здесь.

Удачи и Чао!