Back home

ARTES #030

ARTES #030

ARTES 030

Este é o artigo 30

ARTS é uma atividade iniciada por 由左耳朵耗子--陈皓: Faça pelo menos uma pergunta sobre o algoritmo leetcode toda semana, leia e comente pelo menos um artigo técnico em inglês, aprenda pelo menos uma habilidade técnica e compartilhe um artigo com opiniões e pensamentos. (Ou seja, Algoritmo, Revisão, Dica e Compartilhamento são chamados de ARTS) e persistem por pelo menos um ano.

Pergunta sobre algoritmo de algoritmo

7. Reversão de número inteiro

Dificuldade: Fácil

Dado um inteiro assinado de 32 bits, você precisa reverter cada bit do inteiro.

Exemplo 1:

输入: 123
输出: 321

Exemplo 2:

输入: -123
输出: -321

Exemplo 3:

输入: 120
输出: 21

Nota:

Supondo que nosso ambiente possa armazenar apenas números inteiros assinados de 32 bits, o intervalo de valores é [−2<sup>31</sup>, 2<sup>31 </sup>− 1]. Siga esta suposição e retorne 0 se o número inteiro estourar após a inversão.

Solução

Idioma: C

int reverse(int x) {
    long temp,result=0;;
    if(x>1534236461||x>=2147483642||x<(-2147483641)) return 0;
    while(x){
        temp=x%10;
        x=x/10;
        result=result*10+temp;
    }
    
    if(result>2147483642||result<(-2147483641)) return 0;
    return result;
}
int reverse(int x) {
      long temp,result=0;
    while(x){
        temp=x%10;
        x=x/10;
        result=result*10+temp;
    }
    
    if(result>INT_MAX||result<INT_MIN) return 0;
    return result;
}

8. Número inteiro de conversão de string (atoi)

Dificuldade: Média

Implemente uma função atoi para que ela possa converter uma string em um número inteiro.

Primeiro, a função descarta caracteres de espaço iniciais inúteis conforme necessário até encontrar o primeiro caractere sem espaço.

Quando o primeiro caractere não nulo que encontramos é um sinal positivo ou negativo, o símbolo é combinado com tantos dígitos consecutivos quanto possível quanto o sinal positivo ou negativo do inteiro; se o primeiro caractere não nulo for um número, ele será combinado diretamente com os caracteres numéricos consecutivos subsequentes para formar um número inteiro.

A string também pode conter caracteres extras após a parte inteira válida. Esses caracteres podem ser ignorados e não devem afetar a função.

Nota: Sua função não precisa ser convertida se o primeiro caractere sem espaço na string não for um caractere inteiro válido, se a string estiver vazia ou se contiver apenas caracteres de espaço em branco.

De qualquer forma, se a função não puder realizar uma conversão válida, retorne 0.

Descrição:

Supondo que nosso ambiente possa armazenar apenas números inteiros assinados de 32 bits, o intervalo de valores é [−2<sup>31</sup>, 2<sup>31 </sup>− 1]. Se o valor exceder esse intervalo, qing retornará INT_MAX (2<sup>31 </sup>− 1) ou INT_MIN (−2<sup>31</sup>).

Exemplo 1:

输入: "42"
输出: 42

Exemplo 2:

输入: "   -42"
输出: -42
解释: 第一个非空白字符为 '-', 它是一个负号。
     我们尽可能将负号与后面所有连续出现的数字组合起来,最后得到 -42 。

Exemplo 3:

输入: "4193 with words"
输出: 4193
解释: 转换截止于数字 '3' ,因为它的下一个字符不为数字。

Exemplo 4:

输入: "words and 987"
输出: 0
解释: 第一个非空字符是 'w', 但它不是数字或正、负号。
     因此无法执行有效的转换。```

**Exemplo 5:**

输入: “-91283472332” 输出: -2147483648 解释: 数字 “-91283472332” 超过 32 位有符号整数范围。   因此返回 INT_MIN (−231) 。



#### Solução

Idioma: **C**

```c
#include "limits.h"
int myAtoi(char* str) {
    long  temp = 0;
   const char *ptr = str;  //ptr保存str字符串开头
    while (*str) {
        if (*str == ' ') {
             str++;
            continue;
        }
        
        if (*str == '-') {
            str++;
            long tem = 0;
            while (*str) {
                if (*str>= '0' && *str<= '9') {
                    tem= tem * 10 + (*str - '0');
                     if(-tem<INT_MIN)
                         return INT_MIN;
                    
                    
                    str++;
                    continue;
                }
                else{
                    return -tem;
                }
            }
            return -tem;
        }
        else if(*str == '+'){
            str++;
            long tem = 0;
            while (*str) {
                if (*str>= '0' && *str<= '9') {
                    tem= tem * 10 + (*str - '0');
                    if(tem> INT_MAX)
                        return INT_MAX;
                    
                    str++;
                    continue;
                }
                else{
                    return tem;
                }
            }
            return tem;
        }
        else{
            
         
            int tem = 0;
            while (*str) {
                if (*str>= '0' && *str<= '9') {
                    tem= tem * 10 + (*str - '0');
                       str++;
                    
                    if(tem> INT_MAX)
                        return INT_MAX;
                    
                    continue;
                }
                else{
                    return tem;
                }
            }
            return tem;
       
        }
        
        break;
    }
    
    return 0;
}

O primeiro envio foi aprovado, mas o código ficou feio

Este é o código depois de arrumado:

int myAtoi(char* str) {
    while (*str) {
        if (*str == ' ') {
             str++;
            continue;
        }
        
        if(*str == '-' ||  *str == '+' || (*str>= '0' && *str<= '9')){
            int f=1;
            if ( *str == '-') {
                f=-1;
            }
            
            if (*str == '-' ||  *str == '+') {
                str++;
            }
            
            
            long tem = 0;
            while (*str) {
                if (*str>= '0' && *str<= '9') {
                    tem= tem * 10 + (*str - '0');
                    
                    if (f==1) {
                        if(tem> INT_MAX)
                            return INT_MAX;
                    }
                    else{
                        if(-tem<INT_MIN)
                             return INT_MIN;
                    }
                    
                    
                    
                    str++;
                    continue;
                }
                else{
                    return tem * f;
                }
            }
            return tem * f;
            
        }
        else{
            return 0;
        }
    }
    return 0;
}

O código é mais curto, mas não tão fácil de entender quanto o primeiro.

Revisão

https://dandan2009.github.io/2019/04/25/ios-architecture-patterns/ Este artigo realiza uma análise comparativa de MVC, MVP, MVVM e VIPER, arquiteturas comumente utilizadas para desenvolvimento iOS.

Dicas

Os seguintes agentes UIGestureRecognizer podem resolver o problema de conflitos de gestos:

//Método chamado ao iniciar o reconhecimento de gestos. Retornar NÃO encerrará o reconhecimento e não acionará mais gestos. Uso: o reconhecimento de gestos pode ser usado na posição especificada pelo controle.

  • (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { retorne SIM; }

//Se o acionamento multigesto for suportado, retorne SIM, então vários gestos podem acionar o método ao mesmo tempo, retorne NÃO, é mutuamente exclusivo. //Se vários reconhecedores de gestos podem reconhecer juntos e se o reconhecimento de gestos de um controle impede que o reconhecimento de gestos continue a se propagar para baixo. O retorno padrão é NÃO; se for SIM, após o objeto superior da cadeia de resposta acionar o reconhecimento de gesto, se o objeto inferior também adicionar o gesto e reconhecê-lo com sucesso, ele continuará a ser executado, caso contrário, não continuará a se propagar após o objeto superior ser reconhecido. -(BOOL)gestureRecognizer:(UIGestureRecognizer*) gestoRecognizer deveReconhecerSimultaneamenteWithGestureRecognizer:(UIGestureRecognizer*)otherGestureRecognizer{

}

Compartilhar

Estou reformando uma casa recentemente e pretendo cuidar da água e da eletricidade sozinho. A água já foi feita. Minha experiência depois de fazer isso é que parece difícil fazê-lo, mas não se pode dizer que seja difícil. Mesmo que seja a primeira vez que faço isso, sempre acontecem algumas coisas inesperadas. Por exemplo, ao usar um aparelho de fusão a quente para assumir o controle do tubo, é necessário controlar a temperatura. No início, peguei alguns cachimbos de sucata e experimentei-os com antecedência. Alguns foram dobrados e outros foram passados ​​a ferro. O processo foi um pouco tortuoso, mas os resultados ainda foram satisfatórios. Na verdade, fazer tubulações de água é o mesmo que fazer desenvolvimento, ambos exigem experiência.