Leetcode8. Conversão de número inteiro da corda

título Descrição

Por favor, venha para implementar uma atoifunção, ele pode converter uma string para um inteiro.

Em primeiro lugar, a função vai começar com um caractere de espaço descartar inútil se necessário, até que o achado para o primeiro caractere não-espaço até agora. As seguintes regras de conversão são os seguintes:

  • Se o primeiro caracter é um positivo não-nulo ou número negativo, o sinal de parte de trás com o maior número de caracteres numéricos consecutivos são combinados para formar um inteiro assinado.
  • Se o primeiro caracter não-espaço é um número, o qual é directamente após os caracteres numéricos contínuos estão combinados para formar um número inteiro.
  • A seqüência de caracteres também podem existir após a parte inteira dos caracteres extras eficazes, esses personagens podem ser ignorados, eles não devem afetar a função.

Nota : Se a corda quando o primeiro caractere não-espaço não é uma cadeia de caracteres inteiro válido está vazio ou contém apenas cadeia de caracteres de espaço em branco, a função não exige que você para converter que a conversão não pode ser eficaz.

Em qualquer caso, se a função não pode efetivamente converter, 0 é retornado.

dicas:

  • O título dos caracteres em branco, incluindo apenas caracteres de espaço ' '.
  • Assumimos que o ambiente pode armazenar 32 bits tamanho inteiro assinado, então o intervalo numérico [-231 231--1]. Se o valor for superior a esta gama, o retorno INT_MAX (231-1) ou INT_MIN (-231).

Exemplo 1:

Entrada: "42"
de saída: 42

Exemplo 2:

Entrada: "-42"
de saída: -42
Explicação: um primeiro caractere não-branco '-', é um sinal negativo.
  Vamos todos digitais número e negativo consecutivo depois combinadas, tanto quanto possível, e, finalmente, obter -42.

Exemplo 3:

Entrada: "palavras e 987"
de saída: 0
Explicação: um primeiro de caracteres não-branco 'w', mas não é um número positivo ou número negativo.
Por conseguinte, a conversão não pode ser realizada de forma eficaz.

Exemplo 4:

Entrada: "-91283472332"
Output: -2147483648
explicação: o número "-91283472332" Acima da faixa de 32-bit inteiro assinado.
  Então voltar INT_MIN (-231).

Descrição:

solução do problema

Eu não sei Jiaosha, uma lei sobre a barra Act II.

Um método (Java)

Ideias: passo a passo, de acordo com o objecto do pedido para remover o espaço, e, em seguida, o símbolo é determinado, e, finalmente, o processamento é digital. A parte problemática maior parte do valor limite que é determinado, mais intratável. Pode ser referida como grande prática irmão, a operação de um lado, para assegurar que, no caso de não exceder o valor máximo, determina-se se ou não fora de alcance.
Ponta: O método de levar tantos quanto possível, como Character.isDigit (char c) para determinar se os caracteres numéricos c. Str.trim ou diretamente para o assunto () para remover a seqüência cadeia de caracteres espaços à direita;


public class Solution {
    public int myAtoi(String str) {
        char[] chars = str.toCharArray();
        int n = chars.length;
        int idx = 0;
        while (idx < n && chars[idx] == ' ') {
            // 去掉前导空格
            idx++;
        }
        if (idx == n) {
            //去掉前导空格以后到了末尾了
            return 0;
        }
        boolean negative = false;
        if (chars[idx] == '-') {
            //遇到负号
            negative = true;
            idx++;
        } else if (chars[idx] == '+') {
            // 遇到正号
            idx++;
        } else if (!Character.isDigit(chars[idx])) {
            // 其他符号
            return 0;
        }
        int ans = 0;
        while (idx < n && Character.isDigit(chars[idx])) {
            int digit = chars[idx] - '0';
            if (ans > (Integer.MAX_VALUE - digit) / 10) {
                // 本来应该是 ans * 10 + digit > Integer.MAX_VALUE
                // 但是 *10 和 + digit 都有可能越界,所有都移动到右边去就可以了。
                return negative? Integer.MIN_VALUE : Integer.MAX_VALUE;
            }
            ans = ans * 10 + digit;
            idx++;
        }
        return negative? -ans : ans;
    }
}

Análise complexidade

  • Tempo Complexidade: O ( N ) O (N)
  • complexidade Space: O ( 1 ) O(1)

Método II (Java)

Idéias: Na verdade, uma ideia semelhante, mas desta vez será um pouco mais rápido, preste atenção se aumento numérico de 10 ou sejam susceptíveis de estar fora dos limites, por isso precisamos para determinar se os dois estão fora dos limites.


class Solution {
    public int myAtoi(String str) {
        //去掉str首尾的空格
        str = str.trim();
        if (str.length() == 0) {
            return 0;
        }
        char[] chars = str.toCharArray();
        int min = -2147483648;
        int max = 2147483647;
        int flag = 0;
        int sum = 0;
        
        if ((int) chars[0] == 45) {
            flag = 1;
        } else if ((int) chars[0] == 43) {
            flag = 0;
        } else if ((int) chars[0] < 48 || (int) chars[0] > 57) {
            return 0;
        } else {
            sum = (int) chars[0] - (int) ('0');
        }
        for (int i = 1; i < chars.length; i++) {
            if ((int) chars[i] < 48 || (int) chars[i] > 57) {
                break;
            }
            int num = (int) chars[i] - (int) ('0');
            if (flag == 0 && sum > max / 10) {
                return max;
            }
            if (flag == 1 && -sum < min / 10) {
                return min;
            }
            sum = sum * 10;
            if (flag == 0 && sum > max - num) {
                return max;
            }
            if (flag == 1 && -sum < min + num) {
                return min;
            }
            sum = sum + num;
        }
        if (flag == 1) {
            return -sum;
        }
        return sum;
    }
}

Análise complexidade

  • Tempo Complexidade: O ( N ) O (N)
  • complexidade Space: O ( 1 ) O(1)

2020/04/03

Publicado 43 artigos originais · Louvor obteve 20 · vista 1437

Acho que você gosta

Origin blog.csdn.net/Chen_2018k/article/details/105304192
Recomendado
Clasificación