Back home

ARTES #006

ARTES #006

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 006

Este es el sexto artículo. Está relativamente mal escrito. Espero que mejore cada vez más en el futuro.

Pregunta sobre el algoritmo del algoritmo

Pregunta 41 del algoritmo Leetcode Primer positivo faltante (el primer número positivo faltante): Dificultad: Difícil

Given an unsorted integer array, find the smallest missing positive integer.
Example 1:
Input: [1,2,0]
Output: 3

Example 2:
Input: [3,4,-1,1]
Output: 2

Example 3:
Input: [7,8,9,11,12]
Output: 1
Note:

Your algorithm should run in O(n) time and uses constant extra space.

给定一个未排序的整数数组,找出其中没有出现的最小的正整数。
示例 1:
输入: [1,2,0]
输出: 3

示例 2:
输入: [3,4,-1,1]
输出: 2

示例 3:
输入: [7,8,9,11,12]
输出: 1
说明:

你的算法的时间复杂度应为O(n),并且只能使用常数级别的空间。

Ideas para resolver problemas: Según los requisitos de la pregunta, necesitamos encontrar el número entero positivo más pequeño. Entonces, para una matriz determinada, el valor mínimo del valor de retorno es 1. ¿Cuál es el valor máximo? El valor máximo debe ser el número de elementos de la matriz más 1. Si puedes pensar en esto, el problema estará resuelto.

Mi implementación es la siguiente:

//第一次一次通过的代码  而且运行时间是0ms
int firstMissingPositive(int* nums, int numsSize) {
    int i  = 1;
    for ( ;i<= numsSize; i++) {
        int flag = 0;
        for (int j = 0; j < numsSize; j++) {
            int data = nums[j];
            if (data ==i) {
                flag =1;
                break;
            }
        }
        if (flag == 0) {
            return i;
        }
    }
    return i;
}

Las dos soluciones siguientes son códigos enviados por otros. Puedes aprender de las ideas de otras personas.

int firstMissingPositive1(int* nums, int numsSize) {
    int *hashTable = (int*)calloc(numsSize+1,sizeof(int));
    int res = 1;
    for(int i=0;i<numsSize;++i){
        if(nums[i]>numsSize || nums[i] < 0)
            continue;
        hashTable[nums[i]]++;
    }
    while(hashTable[res]){
        res++;
    }
    return res;
}


int firstMissingPositive2(int* nums, int numsSize) {
    int temp, i, j = 0;
    
    for (i = 0; i < numsSize; i++)
    {
        while ((i != nums[i] - 1) && nums[i] > 0 && nums[i] < numsSize)
        {
            if ((temp = nums[nums[i] - 1]) == nums[i]) break;
            nums[nums[i] - 1] = nums[i];
            nums[i] = temp;
        }
        while (nums[j] == j + 1) j++;
    }
    
    return (j + 1);
}

La siguiente solución está extraída de 刘新宇的算法新解一书, que ahorra más espacio (para ideas específicas, puede buscar en Google la nueva solución de algoritmo de Liu Xinyu, hay un libro electrónico)

#define N 1000000 // 1 million #define WORD_LENGTH sizeof(int) * 8
void setbit(unsigned int* bits, unsigned int i) {
    bits[i / WORD_LENGTH] |= 1<<(i % WORD_LENGTH);
}
int testbit(unsigned int* bits, unsigned int i) {
return bits[i/WORD_LENGTH] & (1<<(i % WORD_LENGTH));
}
unsigned int bits[N/WORD_LENGTH+1];
int min_free(int* xs, int n) {
    int i, len = N/WORD_LENGTH+1;
for(i=0; i<len; ++i)
    bits[i]=0;
for(i=0; i<n; ++i)
    if(xs[i]<n)
        setbit(bits, xs[i]);
for(i=0; i<=n; ++i)
    if(!testbit(bits, i))
        return i;
}

Revisión

Este artículo proviene de: https://medium.freecodecamp.org/why-developers-should-know-how-to-write-dc35aa9b71ab <centro> <tamaño de fuente=6> Por qué los desarrolladores deberían saber escribir </font> </centro> Recientemente encontré un artículo de John Maeda sobre cómo escribir, no codificar, es la habilidad unicornio del diseño. Eso me hizo pensar en cómo la escritura juega un papel en la vida de los desarrolladores. Recientemente vi un artículo de John Maeda sobre cómo escribir, no codificar, es el truco del diseño. Esto me hizo pensar en el papel que juega la escritura en la vida de un desarrollador.

En el mundo actual, impulsado y cargado de datos, hay mucho contenido para consumir. Nos bombardean constantemente con vídeos, imágenes, anuncios, podcasts y artículos. Cada uno de estos medios tiene un tipo de atractivo diferente y siempre parece que hay una fuerte competencia para intentar atraer y retener nuestra atención.

En el mundo actual, impulsado y intensivo en datos, hay mucho contenido para consumir. Nos bombardean constantemente con vídeos, imágenes, anuncios, podcasts y artículos. Cada uno de estos medios tiene un tipo diferente de atractivo y siempre parece haber una dura competencia que intenta atraer y retener nuestra atención.

Una muestra de los diferentes tipos de canales de medios disponibles (imagen de Change Conversations).

Con la proliferación de diferentes canales de medios en las últimas décadas, se ha puesto menos énfasis en el contenido escrito y más en lo visual, específicamente videos e imágenes. Según este memorando de 3M de 1997, las personas pueden procesar imágenes 60.000 veces más rápido que el texto. En las últimas décadas, a medida que han evolucionado varios canales de medios, se ha puesto menos énfasis en el contenido textual y más atención en los elementos visuales, particularmente videos e imágenes. Según un memorando de 3M de 1997, las personas procesan imágenes 60.000 veces más rápido que el texto.

Sin embargo, saber escribir sigue siendo una habilidad importante. Las palabras pueden ser una de las formas más puras de expresar los pensamientos. Las palabras pueden presentarse como cartas, artículos o mensajes de texto. Un escritor difundirá y compartirá sus pensamientos en forma de tinta sobre papel o píxeles digitalizados en una pantalla. Sin embargo, saber escribir sigue siendo una habilidad importante. El lenguaje es una de las formas más puras en las que una persona puede expresar sus pensamientos. El lenguaje puede expresarse como una carta, un artículo o un mensaje de texto. Los escritores se comunican y comparten sus ideas con tinta sobre papel o píxeles digitales en una pantalla.

He aprendido que escribir bien puede ser un catalizador para el éxito, ya sea en el ámbito del crecimiento personal, el desarrollo profesional o la prosperidad social. Muchas de las habilidades que he desarrollado al escribir docenas de artículos en los últimos años se han trasladado a mi nuevo puesto de tiempo completo como ingeniero de software en Putnam Investments. Aprendí que escribir bien puede ser un catalizador del éxito, ya sea de crecimiento personal, desarrollo profesional o prosperidad social. En los últimos años, muchas de las habilidades que adquirí al escribir docenas de artículos se han traducido en mi nuevo puesto de tiempo completo como ingeniero de software en Putnam Investments. Foto de Aaron Burden en Unsplash.

Como desarrollador, aquí hay cinco beneficios que he encontrado al aprender a escribir. Como desarrollador, aquí hay cinco beneficios que he aprendido al aprender a escribir.

1. Escribir bien te convierte en un mejor comunicador (escribir bien puede convertirte en un mejor comunicador)

El beneficio más obvio que he obtenido al escribir con frecuencia es que escribir bien me ha convertido en un mejor comunicador. Como seres humanos, dependemos principalmente de nuestras palabras para transmitir nuestros pensamientos y sentimientos a los demás. Al escribir con frecuencia, puedo expresar mis pensamientos más fácilmente, sin tener que preocuparme por si estoy usando las palabras correctas, si escribo demasiado o muy poco, o si soy demasiado vago o complicado. El beneficio más obvio que he obtenido al escribir con frecuencia es que escribir bien me convierte en un mejor comunicador. Como seres humanos, dependemos principalmente de nuestras palabras para transmitir nuestros pensamientos y sentimientos a los demás. Al escribir con regularidad, puedo expresar mis ideas más fácilmente sin tener que preocuparme por si estoy usando las palabras correctas, si escribo demasiado o muy poco, o si soy demasiado vago o complejo.

Imagen de https://zalarieunique.ru.

En el trabajo, puedo redactar correos electrónicos concisos o enviar mensajes instantáneos sin tener que recurrir a un diccionario para deletrear correctamente una palabra o a un diccionario de sinónimos para parecer más inteligente. Cuando los pensamientos pueden fluir libremente de su mente a su mano, las palabras que salen en papel fluyen con fluidez y no necesitan ser manipuladas para lograr un propósito específico. En el trabajo, puedo redactar correos electrónicos concisos o enviar mensajes instantáneos sin tener que recurrir a un diccionario o tesauro para parecer inteligente. Cuando las ideas pueden fluir libremente de su cabeza a sus manos, las palabras en el papel fluyen suavemente sin tener que ser manipuladas para lograr un propósito específico.La escritura, como muchas otras manualidades, requiere años de práctica para perfeccionarse. La mejor parte de escribir es que la mejora es detectable. Puede mirar trabajos anteriores y ver mejoras visibles con el tiempo. La escritura, como muchas otras manualidades, requiere años de práctica para perfeccionarse. Lo mejor de escribir es que el progreso se nota. Puede consultar trabajos anteriores y ver mejoras notables con el tiempo.

2. Escribir para una audiencia te ayuda a escribir mejor documentación (escribir para una audiencia puede ayudarte a escribir mejor documentación)

Parte de los criterios para ser un buen desarrollador es saber comunicar los requisitos y especificaciones técnicas a otras partes interesadas. Conocer a su audiencia es una parte importante de la redacción; lo mismo se aplica cuando se comunica con las partes interesadas o cuando se escribe cualquier tipo de documentación.

Parte de ser un buen desarrollador es saber comunicar los requisitos y especificaciones técnicas a otras partes interesadas. Conocer a su audiencia es una parte importante de la redacción, y lo mismo ocurre con la comunicación con las partes interesadas o la redacción de cualquier tipo de documentación.

Cuando trabajas con miembros del equipo menos técnicos, debes explicar los términos y conceptos técnicos de una manera que tenga sentido y resuene para quienquiera que esté trabajando. Por ejemplo, cuando trabajo con diseñadores y propietarios de productos, normalmente trato de proporcionar una descripción general de alto nivel de cualquier cosa en la que estoy trabajando sin atascarme en los detalles. Para los diseñadores, trato de comunicar cómo se debe implementar la función desde una perspectiva de UX o UI. Para los propietarios de productos, trato de enmarcar mi trabajo desde la perspectiva del negocio.

Cuando trabaje con miembros del equipo menos técnicos, debe explicar los términos y conceptos técnicos de una manera que tenga sentido y resuene con cualquier persona con la que trabaje. Por ejemplo, cuando trabajo con diseñadores y propietarios de productos, normalmente proporciono una descripción general de alto nivel de lo que estoy haciendo sin atascarme en los detalles. Para los diseñadores, trato de ilustrar cómo se debe implementar la función desde la experiencia del usuario o la perspectiva de la interfaz de usuario. Para los propietarios de productos, intento organizar mi trabajo desde una perspectiva empresarial.

Además, los desarrolladores también deben comunicar su trabajo a otros desarrolladores. Ya sea nombrar variables o nombres de funciones, escribir comentarios en línea o documentar cómo debería funcionar el sistema desde un alto nivel, los desarrolladores necesitan saber cómo escribir buena documentación para que el código sea comprensible y mantenible. Siempre que escribo documentación, intento que sea lo más completa posible. Cualquier desarrollador que trabaje en mi código base podrá comprender la estructura de alto nivel y también podrá contribuir instantáneamente (inmediatamente/inmediatamente) sin tener que deconstruir ni aplicar ingeniería inversa al código.

Además, los desarrolladores deben comunicar su trabajo a otros desarrolladores. Ya sea para nombrar variables o funciones, escribir comentarios en línea o documentar cómo debería funcionar un sistema desde un nivel alto, los desarrolladores necesitan saber cómo escribir buena documentación para que el código sea fácil de entender y mantener. Siempre que escribo un documento, intento que sea lo más completo posible. Cualquier desarrollador que trabaje en mi código base comprende la estructura de alto nivel y puede contribuir de inmediato sin tener que deconstruir ni aplicar ingeniería inversa al código.

3. Escribir te hace apreciar las idiosincrasias de la programación.

En 2011, un Redditor publicó en el subreddit /r/programming sobre las diferencias y similitudes entre escritura y programación. Algunos dicen que programar es similar a escribir en el sentido de que es una habilidad que no es conceptualmente difícil, pero que se perfecciona con el tiempo. Otros afirman que escribir es completamente diferente a programar en el sentido de que escribir es un esfuerzo creativo, mientras que la programación es una ciencia más complicada que requiere una comprensión más profunda de los conceptos fundamentales.

En 2011, un usuario de Reddit publicó en /r/programming sobre las similitudes y diferencias entre escribir y programar. Algunas personas dicen que programar es similar a escribir en el sentido de que es una habilidad que no es conceptualmente difícil pero que se vuelve cada vez más refinada con el tiempo. Otros creen que escribir y programar son completamente diferentes porque escribir es un esfuerzo creativo, mientras que la programación es una ciencia más compleja que requiere una comprensión más profunda de los conceptos básicos.

El consenso general, con desacuerdos menores en los matices de cada uno, es que tanto la escritura como la programación requieren conocimientos básicos de los fundamentos: sintaxis, estructura y semántica. Sin embargo, lo que diferencia a un aficionado de un veterano (experimentado; veterano/veterano/veterano) en cada campo es la capacidad de ser creativo y lidiar con la complejidad del sistema o tema en cuestión.

El consenso general, con ligeros desacuerdos en cada detalle, es que tanto la escritura como la programación requieren conocimiento de los fundamentos básicos: sintaxis, estructura y semántica. Sin embargo, en todos los campos, lo que separa a los aficionados de los veteranos es su capacidad creativa para manejar las complejidades del sistema o tema en cuestión.

Muchas de estas ideas tocan (tocan involucran; tocan; hablan sobre) los campos de la lingüística y el lenguaje. Muchas de estas perspectivas se relacionan con los campos de la lingüística y el lenguaje.Escribir enseña a los desarrolladores a pensar de manera diferente. Para los desarrolladores, escribir código puede parecer restringido, ya que hay una cantidad limitada de palabras clave, funciones y bibliotecas que se pueden utilizar. Sin embargo, los lenguajes escritos permiten una total libertad de expresión que los lenguajes de programación normalmente no permiten.

Escribir enseña a los desarrolladores a pensar de manera diferente. Para los desarrolladores, escribir código puede resultar restrictivo debido a la cantidad limitada de palabras clave, funciones y bibliotecas que se pueden utilizar. Sin embargo, el lenguaje escrito permite una total libertad de expresión que los lenguajes de programación generalmente no permiten.

Ted Kaminski plantea otro punto interesante sobre el propósito de las palabras tal como las usamos en el código y en otros medios. Ted Kaminski plantea otro punto interesante en lo que respecta a la forma en que usamos las palabras en el código y otros medios.

“For one, writing is meant(意味着) to be read. Code is meant to be read and changed.” -Ted Kaminski
“首先,写作是为了阅读。 代码应该被阅读和更改。“ - 泰德卡明斯基

Dentro del ámbito de la escritura, parece como si con el tiempo se hubiera creado una estricta dicotomía para separar las preocupaciones de los escritores de las de los lectores. La escritura parece estar escrita en piedra, mientras que el código es un esfuerzo continuo que busca mejorar (basado en; cerca de; sobre) lo antiguo.

En el terreno de la escritura, parece que con el tiempo se ha creado una estricta dicotomía, dividiendo las inquietudes del escritor y del lector. La escritura parece estática (escrita en piedra), mientras que la codificación es un esfuerzo continuo para mejorar algo antiguo.

En muchos sentidos, escribir “creativamente” y escribir código comparten muchas similitudes, pero conocer sus diferencias me hace apreciar ambos mucho más.

En muchos sentidos, escribir “creativamente” y escribir código tienen muchas similitudes, pero comprender sus diferencias me ha hecho apreciar ambos aún más.

4. Escribir te da la oportunidad de aplicar lo que aprendes (escribir te da la oportunidad de aplicar lo que aprendes)

Cuando escribo, siempre siento como si estuviera teniendo una conversación conmigo mismo. Al terminar un libro o descubrir algo importante, trato de dejar que mis pensamientos reflexionen escribiendo un artículo sobre lo que he aprendido. Para mí, he descubierto que la mejor manera de impulsar mis conocimientos en un área particular (especial; detallada; única; exigente) es escribir sobre ese tema.

Cuando escribo, siempre siento como si estuviera teniendo una conversación conmigo mismo. Cuando termino de leer un libro o descubro algo importante, trato de entenderlo escribiendo un ensayo sobre lo que aprendí. Para mí, creo que la mejor manera de avanzar en mis conocimientos en un campo en particular es escribir sobre el tema.

En freeCodeCamp y en muchos otros sitios web que ofrecen tutoriales básicos de desarrollo, los autores escriben sobre una variedad de temas y conceptos diferentes. Parte de la razón por la que tantos voluntarios dedican tiempo a escribir artículos no es solo para poder compartir sus experiencias y ayudar a otros, sino también para reforzar los conocimientos adquiridos sobre el tema sobre el que escriben.

En freeCodeCamp y muchos otros sitios web que ofrecen tutoriales básicos de desarrollo, los autores escriben sobre una variedad de temas y conceptos diferentes. Parte de la razón por la que tantos voluntarios dedican su tiempo a escribir artículos es que no sólo pueden compartir sus experiencias y ayudar a otros, sino que también pueden mejorar su conocimiento sobre los temas sobre los que escriben.

freeCodeCamp, uno de los mejores recursos para tutoriales y artículos de desarrollo. freeCodeCamp, uno de los mejores recursos para tutoriales y artículos de desarrollo.

Cuando escribo sobre temas que aprendo, generalmente realizo (realizo; dirijo la gestión vt.; orientación; desempeño n. conducta; comportamiento; implementación) investigaciones adicionales (adicionales, adicionales) (investigación; investigación) que a menudo me llevan a encontrar fragmentos (fragmentos) de información a los que de otro modo no estaría expuesto. perspectivas y puntos de vista que desafían mi perspectiva inicial. Todo el proceso de escritura es una conversación viva y continua que me permite procesar la información que encuentro y emitir mis propios juicios.

Cuando escribo sobre un tema del que sé algo, a menudo realizo investigaciones adicionales, lo que a menudo me expone a fragmentos de información a los que normalmente no estaría expuesto. Cuando escribo, es más probable que recuerde lo que he aprendido. Además, a veces encuentro diferentes percepciones y perspectivas que desafían mis puntos de vista originales. Todo el proceso de escritura es una conversación viva y continua que me permite procesar la información que encuentro y emitir mis propios juicios.

Escribir es una excelente manera de organizar y ordenar tus pensamientos (Foto de Radu Florin en Unsplash).

Escribir es una excelente manera de digerir y procesar la información que recibimos. Sin embargo, la erudición y el intelecto no provienen de la cantidad de información que recibimos, sino de nuestra capacidad para procesar esa información y sacar conclusiones significativas de ella.

Escribir es una excelente manera de digerir y procesar la información que tenemos. Sin embargo, la erudición y la inteligencia surgen no de la cantidad de información que recibimos, sino de nuestra capacidad para procesar esa información y sacar conclusiones significativas de ella.

Escribir es una excelente manera de digerir y procesar información. Sin embargo, el conocimiento y la inteligencia no provienen de la cantidad de información que absorbemos, sino de nuestra capacidad para procesar esa información y sacar conclusiones significativas de ella.#### 5. Escribir como forma de catarsis(Escribir es una forma de catarsis/Escribir es una forma de catarsis) Esta última razón por la que creo que escribir es importante puede no ser tan directamente relevante para el rol de desarrollador como las últimas cuatro razones. Pero creo que es igual de importante, si no más. Una gran parte de la razón por la que elijo escribir es porque escribir es una gran salida para mis emociones y sentimientos. No me gusta reprimir mis sentimientos y pensamientos, por eso busco la escritura como una forma de catarsis. La última razón por la que creo que escribir es importante puede no estar directamente relacionada con la función de desarrollador por las últimas cuatro razones. Pero creo que eso también es importante, si no más. Una gran parte de la razón por la que elijo escribir es porque escribir es una salida importante para mis emociones y sentimientos. No me gusta reprimir mis sentimientos y pensamientos, por eso utilizo la escritura como una forma de catarsis. La última razón por la que creo que escribir es importante puede no estar tan directamente relacionada con el rol de desarrollador como las últimas cuatro razones. Pero creo que es igual de importante, si no más. Una gran parte de la razón por la que elijo escribir es porque escribir es una gran salida para expresar mis emociones y sentimientos. No me gusta reprimir mis sentimientos y pensamientos, por eso busco la escritura como una forma de catarsis.

Cuando era más joven, solía escribir anotaciones en un diario. Ahora escribo sobre una variedad de temas y los publico para que el mundo los lea. Pero de vez en cuando vuelvo al lápiz y al papel para expresar mis pensamientos personales. Mantengo un diario privado en el que escribo ocasionalmente cuando tengo dudas sobre mis objetivos profesionales, mi vida personal, mis relaciones sociales y todo lo demás. Cuando era más joven, solía escribir anotaciones en un diario. Ahora escribo sobre muchos temas y los publico para que el mundo los lea. Pero de vez en cuando uso lápiz y papel para expresar mis pensamientos personales. De vez en cuando escribo en un diario personal cuando dudo de mis objetivos profesionales, mi vida personal, mis relaciones sociales y todo lo demás. Cuando era joven, solía llevar un diario. Ahora escribo sobre una variedad de temas y los publico para que el mundo los lea. Pero de vez en cuando vuelvo al lápiz y al papel para expresar mis pensamientos personales. Llevo un diario personal en el que escribo ocasionalmente cuando tengo preguntas sobre mis objetivos profesionales, mi vida personal, mis relaciones sociales y todo lo demás.

<tamaño de fuente=6> No hay nada que escribir. Lo único que haces es sentarte frente a una máquina de escribir y sangrar. </font> No hay nada que destacar. Todo lo que tienes que hacer es sentarte frente a una máquina de escribir y sangrar. Escribir no es nada. Lo único que haces es sentarte frente a una máquina de escribir y sangrar.

Cuando escribo sobre mis sentimientos, siento como si estuviera hablando con un amigo que sabe escuchar muy bien. Para mí es una forma de purgar las emociones negativas y hablar con una página vacía sin miedo a ser juzgado. Cuando escribo sobre mis sentimientos, siento como si estuviera hablando con un amigo que sabe escuchar. Es una forma de limpiar mi mente de negatividad y hablar con una página en blanco sin temor a ser juzgado. Cuando escribo sobre mis sentimientos, siento como si estuviera hablando con un amigo que me escucha bien. Para mí, es una forma de dejar de lado las emociones negativas y hablar con una página en blanco sin miedo a ser juzgada.

Escribir tiene muchos beneficios y, aunque puede que no sea su forma preferida de expresar sus pensamientos, es una habilidad necesaria y útil incluso en el mundo cacofónico y caótico de hoy. Incluso si eres principiante en el mundo de la escritura, te recomiendo que pruebes a sentarte solo con tus pensamientos y dejar que tu mente fluya libremente. Es sorprendente lo que se te ocurre. La escritura tiene muchos beneficios y, si bien puede que no sea su primera opción para expresar sus pensamientos, es una habilidad necesaria y útil incluso en el ruidoso y caótico mundo actual. Incluso si eres principiante en el mundo de la escritura, te recomiendo que pienses solo en tus pensamientos y los dejes fluir libremente. Lo que se te ocurre es asombroso. Escribir tiene muchos beneficios y, si bien puede que no sea su primera opción para expresar sus pensamientos, es una habilidad necesaria y útil, incluso en el mundo ruidoso y confuso de hoy. Incluso si eres nuevo en la escritura, te sugiero que intentes sentarte solo con tus pensamientos y dejar que fluyan libremente. Es sorprendente lo que se te ocurre.

. . .

¡Gracias por tomarse el tiempo de leer mi artículo! ¡Gracias por tomarse el tiempo de leer mi artículo!

Si te gustó este artículo, aplaude, sígueme en Medium y recomienda este artículo a tus amigos. ¡No dudes en seguirme en Instagram o conectarme en LinkedIn! Si te gustó este artículo, aplaude, sigue mis instrucciones y recomienda este artículo a tus amigos. ¡No dudes en seguirme en Instagram o conectarme en LinkedIn!

Derek Mei http://www.derekmei.com

CONSEJOS:

Cómo descargar una imagen grande

Normalmente utilizamos SDWebImage para descargar imágenes. SDWebImage descarga imágenes directamente en la memoria y las utiliza directamente para mostrarlas. Sin embargo, si una imagen es muy grande, descargarla directamente usando SDWebImage probablemente provoque un aumento repentino de la memoria y provoque un bloqueo. ¿Cómo solucionar este problema? Apple tiene oficialmente un ejemplo de carga de imágenes grandes locales (https://developer.apple.com/library/archive/samplecode/LargeImageDownsizing/Introduction/Intro.html#//apple_ref/doc/uid/DTS40011173-Intro-DontLinkElementID_2),参照这个例子,我们可以先把图片下载到本地,然后再用苹果的例子进行加载图片,下载图片到本地可以用AFNetWorking,把图片先下载到本地。

Compartir:

Cómo aprender bien la estructura de datos:

Aquí hay algunas opiniones de otras personas como referencia:

https://www.zhihu.com/question/19830721/answer/205887662
数据结构的那些排序算法总是记不住,这个真的背的吗?
https://www.zhihu.com/question/51337272/answer/438910111
背下来吧,就背`快排`和`堆排`就行,`归并排序`不用背,但最好背下来怎么合并两个有序链表。这三个(其实是两个半)背下来,可以很多变化,比如说快排可以变换成找top k或者中位数的selection算法。堆排背下来就搞懂了二叉堆,堆可以做N多涉及优先级队列的算法,最短路也用得到。这些搞下来,你就熟悉了数组,链表,堆,二叉树,然后你会发现二叉树可以放在数组里,也可以像链表那样连着。图也是可以用数组和链表来表达成邻接表,然后你会发现Hash表也是类似的结构。到此为止,你只需要背这两个半的排序,本科时代的数据结构与算法你就基本学通了。。。。

Aquí hay algunos resúmenes de clasificación:

理解的基础上归下类,记下每种特点就行了,还是挺直观的。下面就以常用的六个排序算法(升序)为例说下特点。
三种`n^2`的:冒泡,选择和插入。
冒泡:目的,每次排好最后一个。方式,从第一个开始查看相邻俩,不合适(前面的大)就交换,这样最后一个一定是最大的。然后,数组元素减一(最后一个排好了扔了吧),缩小规模再来一次。
选择:每次从待选数组中拎出一个最大的来,放到最后,然后缩小规模再来一次。
插入:假设后面的序列是有序的,每次从剩余数组中拎出最后一个,插入到有序数组中合适位置。然后剩余数组缩小规模再插一次。
三种nlgn的:快排,归并和堆排。
快排:每次随便选一个,把它整合适了(放到最终有序数组正确位置),然后比他小的扔左边,比他大的扔右边。然后除掉该数字外的左右子数组各自缩小规模再来一次。
归并:随便找个位置,砍成两半。这两半各自缩小规模了吧,然后假设他们自己来了好多次排好了。最后合并这俩有序数组就行。
堆排:这个比较有意思,核心要实现一个堆化函数。这个函数什么意思呢,就是假设一个大顶堆只有根元素不合法,左右子树都合法(符合堆性质),然后把堆顶元素一路往下搞,跟冒泡差不多,使整个树满足堆的性质。然后呢,把整个数组搞成符合堆的性质(自底而上,从第一个有孩子的元素一直调用堆化函数搞到根元素),把第一个(堆顶,即最大元素)和最后一个交换。如此一来,规模缩小一个,再来一次(堆化&交换)。其他还有shell排啦,桶排啦。不急,消化了这六个再说。


即便你看了算法的证明,某种程度上还是“背”(为什么这么说,后面会详述)。我自己遇到新算法基本是会看证明的,但是发现没多久还是会忘掉,这是死记硬背的标准症状。如果你也啃过算法书,我相信很大可能性你会有同感:为什么当时明明懂了,但没多久就忘掉了呢?为什么当时明明非常理解其证明,但没过多久想要自己去证明时却发现怎么都没法补上证明中缺失的一环呢?(http://mindhacks.cn/2011/07/10/the-importance-of-knowing-why-part3/)

Mi opinión: Al aprender algoritmos y estructuras de datos, si la base es relativamente pobre, primero puede escribir las estructuras de datos de algunos algoritmos básicos y luego debe poder implementar estos algoritmos básicos y estructuras de datos usted mismo. Después de comprender a fondo estas cosas básicas, podrá resolver preguntas más difíciles, porque las soluciones a preguntas más difíciles utilizarán cosas básicas. No acepte preguntas difíciles desde el principio. No tiene sentido. No sólo minará su confianza, sino que no podrá comprender muchas de las soluciones. Todo lo que tienes que hacer es familiarizarte con los algoritmos básicos y las estructuras de datos. Si está familiarizado con él, al menos podrá implementarlo en código. No significa simplemente que sientas que lo entiendes. Existe una gran brecha entre la comprensión y la implementación. Sólo cuando lo implementes tú mismo podrás sentir los detalles y la esencia.

Lo mejor es familiarizarse con la clasificación y la búsqueda de la siguiente manera: Clasificación de uso común: clasificación por inserción clasificación de selección fusionar ordenar clasificación de burbujas clasificación de montón clasificación rápida contando ordenar Ordenación por base ordenar cubos

Encontrar estructura: Árbol de búsqueda binaria [BST] Árbol de búsqueda binaria equilibrado [AVL] Árbol de búsqueda multidireccional/árbol B~/árbol B+ árbol negro rojo [RBT] Comparación dinámica del árbol de búsqueda