Back home

ARTES #013

ARTES #013

ARTES es una actividad iniciada por 由左耳朵耗子--陈皓: Haga al menos una pregunta sobre el algoritmo leetcode cada semana, lea y comente al menos un artículo técnico en inglés, aprenda al menos una habilidad técnica y comparta un artículo con opiniones y pensamientos. (Es decir, Algoritmo, Revisión, Sugerencia y Compartir se denominan ARTS) y persisten durante al menos un año.

##ARTES 013

este es el articulo 13

Pregunta sobre el algoritmo del algoritmo

479. Producto palíndromo más grande

Dificultad: Fácil

Encuentra el palíndromo más grande formado a partir del producto de dos números de n dígitos.

Dado que el resultado podría ser muy grande, deberías devolver el palíndromo más grande mod 1337.

Ejemplo:

Entrada: 2

Salida: 987

Explicación: 99 x 91 = 9009, 9009 % 1337 = 987

Nota:

El rango de n es [1,8].

Solución

Idioma: C

La etiqueta de esta pregunta es fácil, lo cual es más difícil para mí que las preguntas difíciles que hice antes. Después de ver por primera vez la etiqueta fácil, no le presté mucha atención, así que simplemente usé la búsqueda de fuerza bruta para hacerlo, recorrí todas las combinaciones de números, encontré el producto y luego juzgué si es un número palíndromo. El resultado es un tiempo de espera. Lo probé y tardó varios minutos en ejecutarse cuando n=5.

int largestPalindrome(int n) {
    if (n==1) {
        return 9;
    }
    long int left = 0;
    for (long int i = 0; i < n; i++) {
        left = left*10 + 9;
    }
    long int right = left;
    long int low = pow(10,n-1);

    int maxpalindrome = 0;

    for (; left >0; left--) {
        right=left;
        for (; right >0; right--) {
            int count = left * right;
            int count1=count;
            int palindrome = 0;
            for (; count >0; ) {
                palindrome = palindrome *10 + count%10;
                count = count/10;
            }

            if (palindrome == count1) {
                if (palindrome > maxpalindrome) {
                    maxpalindrome =palindrome;
                }
            }
        }

    }
        return maxpalindrome%1337;;

Sólo puedo cambiar de opinión. Primero encuentro la cantidad de palíndromos y luego los divido para ver si cumplen con los requisitos. El resultado aún caduca. Lo imprimí y descubrí que hay bastantes palíndromos.

int largestPalindrome(int n) {
    if (n==1) {
        return 9;
    }
    long int left = 0;
    for (long int i = 0; i < n; i++) {
        left = left*10 + 9;
    }
    long int right = left;

    long int low = pow(10,n-1);
    
    for (long int i = left * right; i>0; i--) {
        long int count = i;
        long int count1=count;
        long int palindrome = 0;
        for (; count >0; ) {
            //找回文数  1234 4321
            palindrome = palindrome *10 + count%10;
            count = count/10;
            if (count<palindrome) {
                break;
            }
            
            if (count == palindrome) {
                if (count > right) {
                    break;
                }
                for (long int j = left; j>count1/right; j--) {
                    if (count1%j ==0 ) {
                        return count1 % 1337;
                    }
                  
                }
            }
        }

    }
    return 0;
}

Al final, todavía no pude encontrar una respuesta que no expirara. Las respuestas a continuación son de otros. Úsalos para aprender de:


long int creatPalindrome(long int num,int n){
    long int p=num*pow(10,n);
    for(int i=0;i<n;i++){
        p=p+(num/(long int)pow(10,n-i-1))*(long int)pow(10,i);
        num=num%(long int)pow(10,n-i-1);
    }
    return p;
}
int largestPalindrome(int n) {
    if(n==1){return 9;}
    long int p=pow(10,n)-1;
    long int q=p;
    long int temp=pow(10,n-1);
    long int ret=0;
    long int ret1=0;
    while(p>=temp){
        ret=creatPalindrome(p,n);
        for(int i=q;i>=temp;i--){
            ret1=ret/i;
            if(ret1>=i){break;}
            if(ret1>=temp&&ret%i==0)
            {
                return ret%1337;

            }
        }
        p--;
    }
    return NULL;
}


Revisión

1.Este artículo proviene de https://medium.freecodecamp.org/how-i-launched-an-ios-app-with-a-teenager-926b5a65a991. Este artículo habla principalmente sobre cómo enseñar a un adolescente a implementar una aplicación iOS relacionada con la natación.

https://medium.freecodecamp.org/how-i-launched-an-ios-app-with-a-teenager-926b5a65a991

Cómo lancé una aplicación para iOS con un adolescente

Cómo pasar de Scratch a una aplicación de iPhone en la App store Cómo obtener una aplicación para iPhone desde cero en la App Store

Como continuación de dos de mis artículos anteriores (Cómo enseñar programación a adolescentes y Guía para principiantes de Raspberry Pi), quiero compartir mis experiencias al ayudar a un adolescente a pasar de codificar en Scratch a crear e implementar una aplicación para iOS. Como continuación de mis dos artículos anteriores, (Cómo enseñar programación a adolescentes y Guía para principiantes de Raspberry Pi), me gustaría compartir mi experiencia ayudando a un adolescente a pasar de codificar desde cero a crear e implementar una aplicación para iOS.

Como mencioné en uno de mis artículos anteriores, noté que los adolescentes tienen un fuerte deseo de hacer algo que parezca más real. Entonces, la pregunta natural que surgió repetidamente en muchas de mis clases fue “¿Podemos crear una aplicación para iPhone?”. Sentí que era el momento adecuado para que los estudiantes crearan una aplicación y les pedí a cada uno que presentara una idea. Como mencioné en uno de mis artículos anteriores, he notado que los adolescentes tienen un fuerte deseo de hacer cosas que les parezcan más auténticas. Entonces, una pregunta natural que surge una y otra vez en muchas de mis clases es “¿Podemos desarrollar una aplicación para iPhone?” Siento que ahora es el momento de que los estudiantes desarrollen aplicaciones y les pido a cada uno que presente una idea.

Una semana después, uno de los estudiantes regresó con una idea y parecía realmente interesante, así que decidimos tomarnos un tiempo fuera del horario habitual de clase y desarrollarla juntos. Y terminamos con una aplicación genial llamada SwimGrader. Una semana después, uno de los estudiantes regresó con una idea que parecía realmente interesante, así que decidimos pasar un tiempo fuera del horario habitual de clases y hacerlo juntos. Terminamos desarrollando una aplicación genial llamada Swim Grader.

¿Cómo surgió SwimGrader? ¿De qué se trata SwimGrader?

Mi alumno es un ávido nadador y siempre ha tenido curiosidad por saber qué tan bien sabe nadar. Evaluar tu propia habilidad para nadar no es realmente obvio y, a menudo, necesitas que un experto te diga qué tan bueno eres. A mi alumno le encanta nadar y siempre siente curiosidad por saber qué tan buenas son sus habilidades para nadar. Evaluar tu propia habilidad para nadar no siempre es obvio y, a menudo, necesitas que un experto te diga qué tan bueno eres.

Todos sabemos que reducir el tiempo de vuelta es el objetivo al que apuntan la mayoría de los atletas, por lo que mucha gente intenta hacerlo. Sin embargo, es bastante difícil saber en detalle en qué debes trabajar para lograr tiempos de vuelta más bajos. Por supuesto, puedes intentar patear más rápido y practicar más para ganar más músculos al nadar, pero normalmente esa no es la mejor manera de mejorar tu natación. Todos sabemos que reducir los tiempos de vuelta es el objetivo de la mayoría de los deportistas, por eso muchos intentan hacerlo. Sin embargo, es bastante difícil saber qué hay que hacer para conseguir tiempos de vuelta más bajos. Por supuesto, puedes probar patadas más rápidas y más ejercicios para ganar más músculo al nadar, pero esa no suele ser la mejor manera de mejorar tu natación.

A partir de esto, mi alumno pensó que la gente necesitaba algo que pudiera identificar un área de natación en la que deberían trabajar a continuación. Entonces, su brillante idea fue crear una aplicación que pudiera evaluar varios aspectos de tu natación y decirte en qué área deberías trabajar para mejorar. A partir de ese momento, mis alumnos decidieron que la gente necesitaba algo para identificar qué áreas de la natación debían estudiar a continuación. Entonces, su brillante idea fue crear una aplicación que evaluara cada aspecto de tu natación y te dijera qué áreas deberías mejorar.

Sabiendo por experiencia lo difícil que es mejorar mi natación, su idea me impresionó mucho. No era nada de lo que hubiera oído hablar antes y tenía un caso de uso específico que podría beneficiar potencialmente a mucha gente. Sin embargo, como mi alumno nunca antes había creado una aplicación para iPhone, decidimos trabajar juntos en ella desde cero. Sabiendo por experiencia lo difícil que era mejorar mi natación, sus ideas me impresionaron. Esto no es algo de lo que haya oído hablar antes y tiene un caso de uso específico que podría beneficiar a mucha gente. Sin embargo, como mis alumnos nunca antes habían desarrollado una aplicación para iPhone, decidimos empezar juntos desde cero.

Empezando

Como no soy un nadador competitivo y también pensé que sería un buen ejercicio de reflexión, le pedí a mi alumno que ideara el diseño de la aplicación y las métricas que podríamos usar para calificar al nadador en la aplicación. Como no soy un nadador competitivo y pensé que sería un buen ejercicio de pensamiento, les pedí a mis alumnos que idearan diseños para la aplicación y métricas que pudiéramos usar para calificar a los nadadores dentro de la aplicación.Este proceso terminó siendo una experiencia de aprendizaje realmente buena. Este ejercicio no solo ayudó al estudiante a aclarar los detalles del proyecto, sino que también mantuvo en línea mis expectativas y las de mi estudiante. Como mencioné en mis artículos sobre la enseñanza a adolescentes, los adolescentes tienen grandes expectativas acerca de hacer cualquier cosa relacionada con la programación. Entonces, después de analizar cada detalle, desde qué datos recopilar, qué páginas crear, cómo funciona cada transición de página y qué métricas mostrar, ambos debíamos establecer claramente nuestros objetivos y expectativas. El proceso terminó siendo una gran experiencia de aprendizaje. Este ejercicio no solo ayudó a los estudiantes a resolver los detalles del proyecto, sino que también me permitió alinearme con sus expectativas. Como mencioné en mi artículo sobre la enseñanza a adolescentes, los adolescentes tienen altas expectativas en cuanto a la programación. Entonces, después de discutir en detalle qué datos recopilar, qué páginas crear, cómo funcionaría cada conversión de página y qué métricas mostrar, todos teníamos claros nuestros objetivos y expectativas.

Y conocer el producto final exacto que planeábamos hacer ayudó al estudiante a mantenerse constantemente involucrado. Conocer el producto final exacto que planeamos producir ayuda a los estudiantes a mantenerse interesados.

Desviándonos un poco del tema principal, muchas veces aprendemos cosas que no sabemos cuándo aplicaremos en nuestras vidas. Esto puede hacernos sentir como si estuviéramos caminando por un largo túnel oscuro sin luz al final. A menudo aprendemos cosas que no sabemos cuándo aplicaremos a nuestras vidas. Esto puede hacernos sentir como si estuviéramos caminando por un largo túnel oscuro sin luz al final.

Esto es especialmente cierto cuando eres más joven, ya que lo más probable es que te digan que aprendas ciertas cosas. Creo que esto provoca que muchos estudiantes no se entusiasmen con lo que aprenden. Aprendí que establecer las expectativas correctas mostrando el final del recorrido de un ejercicio de aprendizaje realmente ayuda a motivar a los estudiantes y aumenta la eficiencia del ejercicio de aprendizaje en sí. Esto es especialmente cierto cuando eres joven, ya que lo más probable es que te digan que aprendas ciertas cosas. Creo que esto da como resultado que muchos estudiantes no estén interesados ​​en lo que están aprendiendo. Aprendí que establecer las expectativas correctas mostrando dónde terminará el proceso de aprendizaje es realmente útil para motivar a los estudiantes y hacer que el proceso de aprendizaje en sí sea más eficiente.

Entonces, volvamos al diseño y las métricas de la aplicación que sugirió el estudiante: mi estudiante primero sugirió que la aplicación, en general, no debería agregar ningún costo adicional al nadador. Quería crear una aplicación que pudiera recopilar estadísticas sin obstaculizar el rendimiento del nadador. Entonces, volvamos al diseño y las métricas de las aplicaciones sugeridas por los estudiantes: mis estudiantes primero sugirieron aplicaciones que, en general, no deberían agregar gastos generales a los nadadores. Quería desarrollar una aplicación que recopilara estadísticas sin afectar el rendimiento del nadador.

El estudiante ya tenía en mente un dispositivo de medición para cumplir exactamente este propósito, que compartiré en la siguiente sección. Después de discutir un poco para encontrar un producto mínimo viable, decidimos que deberíamos centrarnos en recopilar dos métricas específicas: golpes de cabeza y velocidad de giro. El estudiante ya tenía en mente un dispositivo de medición para este propósito, que compartiré con ustedes en la siguiente sección. Después de un poco de discusión, se nos ocurrió un producto mínimo viable y decidimos que deberíamos centrarnos en recopilar dos métricas específicas: BOP de cabeza y velocidad de giro.

Dado que los movimientos de cabeza son en su mayoría movimientos extraños que pueden reducir la eficiencia de la natación, si simplemente podemos contar el número de movimientos de cabeza dentro de un intervalo de tiempo, pensamos que podríamos sugerir una reducción en los movimientos extraños de la cabeza. Dado que los golpes de cabeza son un movimiento extraño que puede reducir la eficiencia de la natación, si pudiéramos simplemente contar el número de golpes de cabeza durante un período de tiempo, pensamos que podríamos recomendar reducir los movimientos extraños de la cabeza.

También estuvimos de acuerdo en que los giros rápidos son necesarios para reducir los tiempos por vuelta. Entonces, si pudiéramos medir el tiempo que le toma al nadador dar una vuelta al final del carril, podríamos calificar al nadador según el tiempo. También estamos de acuerdo en que tomar curvas rápidas es necesario para mejorar los tiempos de vuelta. Entonces, si podemos medir cuánto tiempo le toma a un nadador girar al final del carril, podemos calificar al nadador según ese tiempo.

Dado este diseño y la idea, sólo necesitábamos empezar a implementarlo con el sensor adecuado. Con este diseño e idea en mente, sólo tenemos que empezar a implementarlo con los sensores adecuados.

Entonces, ¿qué hardware hizo posible SwimGrader? Entonces, ¿qué hardware hizo posible SwimGrader?

Aunque los últimos iPhones son resistentes al agua, los nadadores probablemente no quieran arriesgarse a llevar sus carísimos iPhone a la piscina. Entonces, mi alumno sugirió que usáramos un sensor de mbientlab y lo encerráramos en un estuche impermeable. Si bien los últimos iPhones son resistentes al agua, es posible que los nadadores no quieran arriesgarse a llevar un iPhone súper caro a la piscina. Entonces, mis alumnos sugirieron que usáramos un sensor de mbientlab y lo encapsuláramos en una carcasa impermeable.

Este sensor te permite recopilar diversos datos del entorno y de tus movimientos, ya que alberga un acelerómetro, un giroscopio, un barómetro, un termómetro, etc. Además, tienen un código de muestra que puede utilizar para iniciar su aplicación y poder recopilar inmediatamente los datos de interés. Este sensor te permite recopilar diversos datos del entorno y de tus movimientos, ya que contiene un acelerómetro, un giroscopio, un barómetro, un termómetro y más. Además, tienen un código de muestra que puede utilizar para iniciar su aplicación y recopilar inmediatamente los datos de interés.Entonces, nuestra idea fue poner el sensor dentro de su gorro de baño. Consideró que esto afectaría mínimamente la capacidad de los nadadores para nadar, con lo cual estuve de acuerdo. Inmediatamente compramos dos de estos sensores y comenzamos a crear nuestra aplicación. No repasaré los detalles de la creación de una aplicación iOS simple de varias páginas usando Swift, porque se han cubierto en miles de otros artículos (aquí hay un buen artículo mediano que presenta muchos de ellos). Entonces, la idea era poner el sensor dentro de su gorro de baño. Él cree que esto tendrá un impacto mínimo en la capacidad de un nadador para nadar, y estoy de acuerdo. Inmediatamente compramos dos de estos sensores y comenzamos a desarrollar nuestra aplicación. No entraré en detalles sobre cómo crear una aplicación iOS simple de varias páginas usando Swift, ya que se han tratado en miles de otros artículos (aquí hay un buen artículo mediano de muchos).

Ventana de la aplicación SwimGrader

Presentamos SwimGrader

Entonces, después de horas de programación y de pasar por Apple para que nuestra aplicación fuera aprobada en la App Store, finalmente pudimos lanzar SwimGrader. Fue realmente sorprendente ver esto, porque solo ayudé con la configuración inicial del proyecto, que consistía en configurar un proyecto Swift de aplicación de una sola página y ayudar a agregar botones y campos de texto, y una integración simple de hardware para recuperar datos del sensor. Entonces, después de horas de programación y de que nuestra aplicación fuera aprobada por la App Store a través de Apple, finalmente estábamos listos para lanzar Swim Grader. Fue realmente sorprendente ver esto, ya que solo había ayudado con la configuración inicial del proyecto, que incluía configurar un proyecto Swift de aplicación de una sola página, ayudar a agregar botones y campos de texto, y una integración simple de hardware para recuperar datos de los sensores.

Para dar una idea de lo fácil que fue la integración del hardware, aquí hay un fragmento de código para hacer que el LED del sensor parpadee en verde. Recuperar datos fue igual de sencillo, como se puede ver en el siguiente ejemplo. Para ilustrar lo fácil que es la integración de hardware, aquí hay un fragmento de código que hace que el LED del sensor aparezca en verde. Recuperar datos es muy simple, como se muestra en el siguiente ejemplo.

import MetaWear
import MetaWearCpp
MetaWearScanner.shared.startScan(allowDuplicates: true) { (dev) in
    // We found a MetaWear board, see if it is close by
    if dev.rssi.intValue > -50 {
        // We found a MetaWear board!
        MetaWearScanner.shared.stopScan()
        // Connect to the board we found
        dev.connectAndSetup().continueWith { t in
            if let error = t.error {
                // Sorry we couldn't connect
                print(error)
            } else {
                // We are connected! Flash its LED!
                var pattern = MblMwLedPattern()
                mbl_mw_led_load_preset_pattern(
                    &pattern, MBL_MW_LED_PRESET_PULSE)
                mbl_mw_led_stop_and_clear(device.board)
                mbl_mw_led_write_pattern(
                    device.board, &pattern, MBL_MW_LED_COLOR_GREEN)
                mbl_mw_led_play(device.board)
            }
        }
    }
}

Con solo una ayuda limitada, mi alumno fue mucho más allá de mis expectativas al crear un algoritmo de calificación y una interfaz gráfica. Recuperó los datos X, Y, Z del sensor y calificó cuánto se movía la cabeza en cada dirección. Buscó en línea una biblioteca de gráficos en iOS y mostró lo que informaba su sensor. Y, después de terminar su aplicación, ¡siguió adelante y la probó en la piscina! Con ayuda limitada, mis alumnos superaron con creces mis expectativas y crearon un algoritmo de puntuación y una interfaz gráfica. Toma datos X, Y, Z del sensor y proporciona el grado de movimiento de la cabeza en cada dirección. Busca en la web bibliotecas de gráficos en iOS y muestra lo que informan los sensores. Después de completar la solicitud, ¡continuó probándola en la piscina!

Es un esfuerzo de un estudiante de secundaria, por lo que no se verá elegante como Choque de clanes. Sin embargo, creo que es realmente impresionante, viniendo de un joven estudiante que nunca antes había creado una aplicación para iPhone. Después de terminar esto, el estudiante me preguntó: Es un esfuerzo de la escuela secundaria, por lo que no parece tan elegante como Choque de clanes. Sin embargo, pensé que esto era realmente impresionante, viniendo de un joven estudiante que nunca había desarrollado una aplicación para iPhone. Después de hacer esto, el estudiante me preguntó:

¿Podemos crear una aplicación Apple Watch para esto? ¿Podemos crear una aplicación Apple Watch para esto?

Le dije que definitivamente podría crear una versión de la aplicación para Apple Watch en el futuro, pero que probablemente podría crearla sin mi ayuda :). Le dije que definitivamente podría desarrollar una versión de la aplicación para Apple Watch en el futuro, pero que probablemente no necesitaría mi ayuda para hacerlo :).

Pensamientos finales

Como adultos, creo que es muy difícil mantener nuestras ideas frescas, alocadas y actualizadas. Entonces, creo que es realmente educativo escuchar lo que estos jóvenes estudiantes tienen que decir y apoyar lo que quieren hacer en todas las formas posibles. Como adultos, creo que es muy difícil mantener la mente fresca, salvaje y relevante. Entonces, creo que es muy educativo escuchar a estos jóvenes estudiantes y apoyar lo que quieren hacer.

Estas oportunidades no solo abren la puerta a la creación de productos nuevos y emocionantes, sino que apoyar a los estudiantes para que presenten y construyan sus propias ideas les brinda las mejores experiencias educativas. Ver a mi alumno pedirle a la gente que descargue su aplicación me hace sonreír. Espero poder crear una aplicación interesante algún día y mostrársela a mis amigos. Aunque mi alumno se me adelantó en eso :) Estas oportunidades no solo abren la puerta al desarrollo de productos nuevos e interesantes, sino que también apoyan a los estudiantes en el marketing y la construcción de sus propias ideas para brindarles la mejor experiencia educativa posible. Me hace reír ver a mi alumno conseguir que la gente descargue su aplicación. Espero algún día poder desarrollar una aplicación interesante y mostrársela a mis amigos. Aunque mis alumnos se me adelantaron :)

Por cierto, aprendí que crear una aplicación iOS interesante es más fácil que nunca. Hay muchísimos artículos que le ayudarán a crear aplicaciones para todos los propósitos posibles: juegos, aplicaciones de vista única, aplicaciones de redes sociales y muchos más. Además, hay más hardware que nunca que puede conectar fácilmente a su teléfono y ampliar sus capacidades. Por cierto, aprendí que crear una aplicación iOS interesante es más fácil que nunca. Hay muchos artículos que le ayudarán a desarrollar aplicaciones para todos los fines posibles: juegos, aplicaciones de vista única, aplicaciones de redes sociales y más. Además, ahora hay más hardware que puede conectar fácilmente a su teléfono y ampliar su funcionalidad.

Espero poder compartir pronto experiencias sobre la creación de mi propia aplicación. Sólo me preocupa si mis alumnos encontrarán interesante mi aplicación… Espero poder compartir mi experiencia desarrollando aplicaciones pronto. Sólo me preocupa si mis alumnos pensarán que mi aplicación es genial…¡Gracias por leer este artículo! ¡Espero poder convencerte de que trabajes con tus estudiantes o tus hijos y comiences a crear una aplicación sencilla! También estoy abierto a escuchar tus interesantes ideas sobre aplicaciones. ¡Gracias por leer este artículo! ¡Espero poder convencerte de que trabajes con tus estudiantes o tus hijos y comiences a crear una aplicación sencilla! También me encantaría escuchar tus ideas sobre aplicaciones interesantes.

  1. Esta semana traduje la parte no traducida del primer capítulo la semana pasada. El primer capítulo ha sido traducido: https://dandan2009.github.io/2018/10/26/Instruments-chinese-translation/

CONSEJOS

Esta semana encontré un problema con NSCharacterSet, así que estudié este NSCharacterSet y descubrí que la función NSCharacterSet es bastante poderosa.

Conjunto de caracteres NS

Un objeto que representa un conjunto fijo de valores de caracteres Unicode para su uso en operaciones de búsqueda. Un objeto que representa un conjunto fijo de valores de caracteres Unicode utilizados para operaciones de búsqueda.

Descripción general

Un objeto NSCharacterSet representa un conjunto de caracteres compatibles con Unicode. Los objetos NSString y NSScanner utilizan objetos NSCharacterSet para agrupar caracteres para operaciones de búsqueda, de modo que puedan encontrar cualquiera de un conjunto particular de caracteres durante una búsqueda. Las dos clases públicas del clúster, NSCharacterSet y NSMutableCharacterSet, declaran la interfaz programática para conjuntos de caracteres estáticos y dinámicos, respectivamente. El objeto NSCharacterSet representa un juego de caracteres compatible con Unicode (compatible con Unicode). Los objetos NSString y NSScanner utilizan objetos NSCharacterSet para agrupar caracteres para operaciones de búsqueda, de modo que puedan encontrar un conjunto específico de caracteres durante el proceso de búsqueda. Las dos clases públicas del clúster, NSCharacterSet y NSMutableCharacterSet, declaran interfaces de programación para conjuntos de caracteres estáticos y dinámicos, respectivamente.

Los objetos que crea usando estas clases se denominan objetos de juego de caracteres (y cuando no haya confusión, simplemente como juegos de caracteres). Debido a la naturaleza de los grupos de clases, los objetos de juego de caracteres no son instancias reales de las clases NSCharacterSet o NSMutableCharacterSet sino de una de sus subclases privadas. Aunque la clase de un objeto de juego de caracteres es privada, su interfaz es pública, como lo declaran estas superclases abstractas, NSCharacterSet y NSMutableCharacterSet. Las clases adoptan los protocolos NSCopying y NSMutableCopying, lo que hace que sea conveniente convertir un juego de caracteres de un tipo a otro. Los objetos creados usando estas clases se llaman objetos de juego de caracteres (solo juegos de caracteres cuando esto no resulte confuso). Debido a la naturaleza de la agrupación de clases, el objeto del juego de caracteres no es una instancia real de la clase NSCharacterSet o NSMutableCharacterSet, sino una instancia de una de sus subclases privadas. Aunque la clase del objeto del juego de caracteres es privada, su interfaz es pública, declarada por las superclases abstractas NSCharacterSet y NSMutableCharacterSet. La clase de juego de caracteres adopta los protocolos NSCopying y NSMutableCopying, lo que hace que sea conveniente convertir un tipo de juego de caracteres en otro tipo de juego de caracteres.

La clase NSCharacterSet declara la interfaz programática para un objeto que administra un conjunto de caracteres Unicode (consulte la especificación del clúster de clases NSString para obtener información sobre Unicode). El método primitivo principal de NSCharacterSet, CharacterIsMember:, proporciona la base para todos los demás métodos de instancia en su interfaz. Una subclase de NSCharacterSet solo necesita implementar este método, además de mutableCopyWithZone:, para un comportamiento adecuado. Para un rendimiento óptimo, una subclase también debe anular bitmapRepresentation, que de otro modo funciona invocando CharacterIsMember: para cada valor Unicode posible. La clase NSCharacterSet declara una interfaz de programación para un objeto que administra un juego de caracteres Unicode (consulte la especificación del clúster de clases NSString para obtener información sobre Unicode). El método primitivo principal de NSCharacterSet, CharacterIsMember: proporciona la base para todos los métodos de instancia en su interfaz. Una subclase de NSCharacterSet solo necesita implementar este método, más el método mutableCopyWithZone:, para obtener el comportamiento correcto. Para obtener un mejor rendimiento, las subclases también deben anular la representación del mapa de bits; de lo contrario, llame a CharacterIsMember: para todos los valores Unicode posibles.

NSCharacterSet tiene un “puente gratuito” con su homólogo de Core Foundation, CFCharacterSetRef. Consulte Conexión de llamadas gratuitas para obtener más información sobre la conexión de llamadas gratuitas. NSCharacterSet tiene un “puente gratuito” con su contraparte base central CFCharacterSetRef. Para obtener más información sobre la conexión en puente gratuita, consulte la conexión en puente gratuita.

NSCharacter​Set puede procesar cadenas cómodamente

Por ejemplo, determine si una cadena comienza con un número


NSString * string = "3dfdfsa";
unichar c = [string characterAtIndex:0];
if ([[NSCharacterSet decimalDigitCharacterSet] characterIsMember:c]) {
return YES;
} else {
return NO;
}
}

Dos métodos en NSString relacionados con NSCharacterSet: //Limpiar los caracteres en ambos extremos de la cadena según el conjunto de caracteres

  • (NSString *)stringByTrimmingCharactersInSet:(NSCharacterSet *)conjunto; //Dividimos la cadena según el separador del juego de caracteres
  • (NSArray<NSString *> *)componentsSeparatedByCharactersInSet:(NSCharacterSet *)separador;

NSString *cadena = @“123abc123”;

cadena = [cadena stringByTrimmingCharactersInSet:[NSCharacterSet decimalDigitCharacterSet]];

NSLog(@“%@”,string);//Salida abc

//字符集的二进制数据,用于传输、归档、保存成文件
@property (readonly, copy) NSData *bitmapRepresentation;


//一个除了数字字符之外的所有字符的字符集
[[NSCharacterSet decimalDigitCharacterSet] invertedSet]


//判断aCharacter是否包含在字符集中
- (BOOL)characterIsMember:(unichar)aCharacter;
//功能貌似是一样的,入参是UTF-32的字符???不知道这两个方法的区别,知道的朋友不吝赐教
- (BOOL)longCharacterIsMember:(UTF32Char)theLongChar;

//判断theOtherSet是不是自身的子集
- (BOOL)isSupersetOfSet:(NSCharacterSet *)theOtherSet;


- (BOOL)hasMemberInPlane:(uint8_t)thePlane;


Codifica la cadena:

NSString * string =  @"11 =Essential ,Coding Interview Questions + Coding Exercises!" ;
[string  stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet alphanumericCharacterSet]];

alphanumericCharacterSet Todos los números y letras (no distingue entre mayúsculas y minúsculas)

El resultado después de la codificación es:

11%20%3DEssential%20%2CCoding%20Interview%20Questions%20%2B%20Coding%20Exercises%21

Puede ver que el resultado anterior codifica todos los caracteres excepto todos los números y letras.

Luego mira la función de invertedSet

[string stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet alphanumericCharacterSet].invertedSet]

El resultado después de agregar invertedSet es el siguiente:


%31%31 =%45%73%73%65%6E%74%69%61%6C ,%43%6F%64%69%6E%67 %49%6E%74%65%72%76%69%65%77 %51%75%65%73%74%69%6F%6E%73 + %43%6F%64%69%6E%67 %45%78%65%72%63%69%73%65%73!

Puede ver que solo se codifican números y letras.

En otras palabras, NSCharacterSet puede especificar fácilmente qué caracteres codificar. También es posible utilizar characterSetWithCharactersInString para caracteres codificados totalmente personalizados.

NSCharacterSet *dd = [NSCharacterSet characterSetWithCharactersInString@"^~_>+=\"#%/<>?@\\^`{|}"];
```Blog relacionado: https://nshipster.cn/nscharacterset/
#### API de uso común
/** Colección de métodos abreviados de uso común (de uso común, que satisfacen la mayoría de las necesidades) */
 (NSCharacterSet *)controlCharacterSet; // Caracteres de control, incluidos caracteres de nueva línea (\n), caracteres de tabulación (\t), etc. No está claro qué son.
(NSCharacterSet *)whitespaceCharacterSet; //espacio
(NSCharacterSet *)whitespaceAndNewlineCharacterSet;//Espacios y nuevas líneas
(NSCharacterSet *)decimalDigitCharacterSet; //Números del 0 al 9
(NSCharacterSet *)letraCharacterSet; //Todas las letras
(NSCharacterSet *) letras minúsculasCharacterSet; //letras minúsculas
(NSCharacterSet *)mayúsculaLetterCharacterSet; //letras mayúsculas
(NSCharacterSet *)nonBaseCharacterSet; //No base
(NSCharacterSet *)alphanumericCharacterSet; //Todos los números y letras (mayúsculas y minúsculas)
(NSCharacterSet *)descomposableCharacterSet; //descomponible
(NSCharacterSet *)illegalCharacterSet; //Ilegal
(NSCharacterSet *)puntuationCharacterSet; //Los signos de puntuación se refieren a los símbolos utilizados para separar el texto.
(NSCharacterSet *)capitalizedLetterCharacterSet; //capitalizado
(NSCharacterSet *)symbolCharacterSet; // Caracteres de símbolo, excepto signos de puntuación, como símbolos como ¥ y $
(NSCharacterSet *)newlineCharacterSet NS_AVAILABLE(10_5, 2_0);//Carácter de nueva línea



/** Obtener un objeto NSCharacterSet basado en una cadena determinada */
+ (NSCharacterSet *)characterSetWithCharactersInString:(NSString *)aString;

/** Restricciones de cadenas opuestas [consulte los siguientes ejemplos para obtener más detalles] */
@property (solo lectura, copiar) NSCharacterSet *invertedSet;

- carácterEsMiembro:


La función de NSCharacterSet es algo similar a la normal.
:
https://nshipster.cn/nscharacterset/

NSString y Unicode:
https://objccn.io/issue-9-1/#peculiar-unicode-features


Blog en inglés de iOS: https://nshipster.com/
La versión china correspondiente arriba: https://nshipster.cn/

Si no sabe qué es la codificación de caracteres (incluso si tiene buenos conocimientos profesionales), debería aprovechar esta oportunidad para leer y releer este artículo clásico de Joel Spolsky: https://www.joelonsoftware.com/2003/10/08/the-absolute-minimum-every-software-developer-absolutely-positively-must-know-about-unicode-and-character-sets-no-excuses/.



## Compartir

1. Primero comparta un sitio web donde pueda verificar qué bibliotecas de terceros utilizan aplicaciones con grandes descargas o aplicaciones populares en la App Store: https://www.appsight.io

2. Permítanme compartir algunos sitios web más de algoritmos de aprendizaje, algunos son sitios web de videos y otros con animaciones:

    * Video de algoritmo de un chico indio, aprendiendo algoritmo en inglés al mismo tiempo: https://www.youtube.com/channel/UCx-kFfzekMbhODaBss-ZnsA
    
    * Tutorial de algoritmo: https://notes.diguage.com/mysql/#_%E6%97%B6%E9%97%B4%E5%A4%8D%E6%9D%82%E5%BA%A6
    
   * Algoritmo gráfico: https://visualgo.net/zh
   *
    * Esta animación puede ayudarte a comprender el algoritmo: https://www.cs.usfca.edu/~galles/visualization/Algorithms.html
    
    * Explicación animada de algoritmos de uso común: https://www.toptal.com/developers/sorting-algorithms
    
    *Esta animación también es buena, muy chula: http://sorting.at/

3. Recomendar otro curso de bases de datos: https://15445.courses.cs.cmu.edu/fall2017/schedule.html