ARTES #002
ARTES #002
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 002
Este es el segundo artículo y está relativamente mal escrito. Espero que mejore cada vez más en el futuro.
Pregunta sobre el algoritmo del algoritmo
Algoritmo leetcode pregunta 242 Anagrama válido (verifique si es un anagrama)
Given two strings s and t , write a function to determine if t is an anagram of s.
Example 1:
Input: s = "anagram", t = "nagaram"
Output: true
Example 2:
Input: s = "rat", t = "car"
Output: false
Note:
You may assume the string contains only lowercase alphabets.
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的一个字母异位词。
示例 1:
输入: s = "anagram", t = "nagaram"
输出: true
示例 2:
输入: s = "rat", t = "car"
输出: false
说明:
你可以假设字符串只包含小写字母。
La idea inicial es ordenar primero y luego comparar, es decir, ordenar las dos cadenas primero y luego comparar si son iguales. Este método de verificación es el más eficiente. Puede utilizar clasificación por burbujas, clasificación por selección, clasificación por inserción, etc. al realizar la clasificación. Aunque la complejidad de estos tres algoritmos de clasificación es O (n <sup>2</sup>), la prueba encontró que cuando la cantidad de datos es grande, la clasificación por inserción es mucho más rápida que los otros dos, lo que no es del mismo orden de magnitud. La implementación de la ordenación por inserción es la siguiente:
char* insertionSort(char* str) {
for (int j = 1; j < strlen(str); j++) {
char *insertionChar = str + j;
char iChar = *insertionChar;
char * compareChar = insertionChar;
for (int i = j-1; i >=0; i--) {
if (iChar < *(str + i)) {
compareChar = str + i;
*(compareChar +1) = *compareChar;
}
else{
break;
}
}
*compareChar = iChar;
}
return str;
}
bool isAnagram(char* s, char* t) {
if (strlen(s) != strlen(t)){
return false;
}
char *s1 = insertionSort(s);
char *s2 = insertionSort(t);
if (strcmp(s1,s2)) {
return false;
}
else{
return true;
}
}
Pero no puede pasar nada en leetcode. La longitud de la cadena de datos de prueba en leetcode es 100 Kb. Lo medí localmente y me tomó casi 20 segundos usando la ordenación por inserción. Pero si uso la clasificación por burbujas y por selección, me llevó más de una hora terminar.
Si este método no funciona, puedes probar con otra idea. Puede contar si los tipos de caracteres y números contenidos en la cadena son iguales. Por ejemplo, la cadena s contiene 10 letras a, 5 letras by 8 letras k. Si lo mismo ocurre con la cadena t, entonces s es un anagrama de t. Implementado de la siguiente manera
bool isAnagram(char* s, char* t) {
if (strlen(s) != strlen(t)){
return false;
}
int af[26]= {0};
while (*s) {
af[*s++ - 'a']+=1;
}
while (*t) {
af[*t++ - 'a']-=1;
}
for (int i = 0; i<26; i++) {
if (af[i] != 0) {
return false;
}
}
return true;
}
Al implementar esto, solo se usa una matriz en lugar de dos matrices para contar la cantidad de caracteres que aparecen en dos cadenas respectivamente. Esto puede evitar situaciones fuera de los límites debido a demasiadas apariciones de un determinado personaje.
Revisión
El siguiente artículo proviene de: https://littlebitesofcocoa.com/251-face-aware-image-views-with-aspectfillfaceaware;. Habla sobre el uso despectfillfaceaware para darse cuenta de que al configurar una imagen para imageView, si la imagen contiene una cara, la cara se puede mostrar automáticamente en el centro.
Vistas de imágenes con reconocimiento de rostros con AspectFillFaceAware (use AspectFillFaceAware para permitir que imageView reconozca rostros)
Cuando usamos UIImageViews, a veces los modos de contenido integrados pueden obstaculizar nuestro estilo.
Cuando usamos UIImageViews, a veces el modo de contenido integrado destruye nuestro estilo y no puede satisfacer nuestras necesidades.
Muchas veces, mostramos fotografías de personas. En estos casos, sería fantástico si de alguna manera se pudiera indicar a la vista de imagen que recorte inteligentemente la foto alrededor del rostro de la persona.
Muchas veces mostramos fotografías de personas. En estos casos, sería fantástico si la vista de imagen pudiera de alguna manera recortar inteligentemente la foto alrededor del rostro de la persona.
Hoy revisaremos una biblioteca de Beau Nouvelle llamada AspectFillFaceAware. Es súper simple, echemos un vistazo.
Hoy veremos una biblioteca de clases de Beau Nouvelle llamada AspectFillFaceAware. Es muy sencillo, echemos un vistazo.
AspectFillFaceAware es esencialmente solo una extensión de UIImageView. Proporciona dos formas de configurar una vista de imagen para que sea “consciente de la cara”.
AspectFillFaceAware es esencialmente solo una extensión de UIImageView. Proporciona dos métodos para configurar la vista de imágenes para “reconocimiento facial”.
El primero está en Interface Builder, podemos habilitar la función activándola en el Inspector. (¿No ve la opción? Ejecute su proyecto una vez, luego debería aparecer).
La primera forma es en Interface Builder, podemos habilitar la función hojeando Funciones en el Inspector. (¿No ves la opción? Ejecuta tu proyecto una vez y debería aparecer).
<img src=“/img/15334638167496.jpg” ancho=“50%” alto=“50%” /> Así es como se ve:

También podemos habilitar la funcionalidad en el código configurando la imagen de la vista de imagen usando esta nueva función:
También podemos utilizar esta nueva característica a través del código:
imageView.set (imagen: avatar, focusOnFaces: verdadero) Incluso podemos lanzar un radio de esquina rápido en la capa de la vista de imagen para probar la funcionalidad “consciente de la cara” en una vista circular. (es decir, avatares de usuario):
Incluso podemos realizar un radio de esquina rápido en la capa de la vista de imagen para probar la función de “reconocimiento facial” en la vista circular. (es decir, avatar de usuario):
let radio = imageView.bounds.size.width / 2.0 imageView.layer.cornerRadius = radio
Debajo del capó, la biblioteca utiliza un CIDetector de baja precisión con un tipo de CIDetectorTypeFace para manejar la detección de rostros real. ¿Quieres profundizar más aquí? Cubrimos los CIDetectors en el Bite #87.
Debajo del capó, la biblioteca utiliza un CIDetector de baja precisión con el tipo CIDetectorTypeFace para manejar la detección de rostros real. ¿Quieres profundizar más? Presentamos el enfoque CIDetectors en el Bite #87.
Consejo
Presente el método de usar Proxifier y shadowsocks para lograr acceso proxy secundario a Internet.
Algunas empresas necesitan pasar por un proxy para acceder a Internet. En este caso, no podemos utilizar Shadowsocks para acceder a Internet a través de un proxy. Por ejemplo, la empresa en la que estoy actualmente utiliza un proxy para acceder a Internet. Si desea acceder a la red externa, debe conectarse mediante proxy al servidor de la empresa para acceder a Internet. En este caso, usar Shadowsocks directamente no funcionará.
¿Es posible encontrar una manera de permitir que Shadowsocks también use un proxy? Entonces encontré el software Proxifier.
Proxifier, la función de esta herramienta es hacerse cargo de todas las solicitudes emitidas por todas las aplicaciones en ejecución, y luego puede controlar si una aplicación usa un proxy, de modo que las aplicaciones que no admiten proxy también puedan usar un proxy.
Originalmente, el cliente ss (shadowsocks) accede directamente al servidor proxy ss. A través de Proxifier, se puede controlar que el cliente ss vaya primero al proxy de la empresa y luego al servidor proxy ss. El proceso general es el siguiente

- El proceso de configuración es el siguiente:
Abra Proxifier, seleccione la pestaña Proxies para configurar el proxy HTTP de la empresa y el proxy Socks5 local:

El puerto 127.0.0.1 se puede abrir para ver la configuración avanzada de ShadowSocks.
Cuando inicia el cliente ShadowSocks, encontrará que Proxifier captura automáticamente la aplicación denominada ss-local, que es el cliente SS abierto por ShadowSocks, y establece sus reglas de proxy para el proxy de la empresa creado previamente:
Luego deje que Localhost y Default vayan a ss-local (los dos últimos elementos de la imagen).
Puedes ver que las tres primeras configuraciones son Directas. Algunos sitios web o aplicaciones que no requieren un proxy se pueden configurar así. Si descubre que algunas aplicaciones tienen problemas después de habilitar Proxifier, probablemente se deba al proxy. Por ejemplo, después de iniciar Proxifier, descubrí que estaba bloqueado cuando usé Xcode para ejecutar el programa C. Más tarde, descubrí que cuando Xcode ejecutaba el programa C, automáticamente iniciaba un servicio local de debugserver. Desde que configuré el proxy predeterminado, el servicio no pudo comunicarse normalmente. Cambié el servidor de depuración a Direct y puede ejecutarse normalmente. Puede ver que Proxifier puede especificar directamente si el nombre de una aplicación usa un proxy o si una determinada IP usa un proxy. De hecho, es muy cómodo de usar.
Artículo de referencia: http://www.devtalking.com/articles/shadowsocks-guide/ http://blackwolfsec.cc/2016/09/19/Proxifier_Shadowshocks/ https://github.com/cyfdecyf/cow/blob/master/doc/sample-config/rc https://www.latoooo.com/xia_zhe_teng/179.htm http://haoweiguang.me/2017/05/08/Mac下shadowsocks全自动地代理翻墙/ https://blog.e9china.net/tufan/macshanganzhuangcowproxyfanqiangjiaocheng.html
Compartir
Recientemente cambié de empresa, una empresa con mucho trabajo de horas extras. Cuando llegué aquí por primera vez, siempre quise irme, pero después de pensarlo, decidí no irme. Una empresa que puede ser tan grande (escuché que hay casi 20.000 personas en I+D) debe tener algo que valga la pena aprender, así que decidí calmarme y estudiar. En cuanto al trabajo de horas extras, puedes aprender y mejorar mientras trabajas horas extras. Habilidad, la razón por la que vine a esta empresa no es porque mi nivel técnico no sea lo suficientemente bueno, así que tengo que mejorar lo antes posible. No sé dónde vi una frase: “Debes aguantar o salir de aquí”.
De hecho, muchas cosas son así. Cuando tu capacidad no es digna de tu ambición, lo que tienes que hacer es mejorar tu capacidad en lugar de quejarte del medio ambiente.
What to read next
Want more posts about ARTS?
Posts in the same category are usually the best next step for reading more on this topic.
View same categoryWant to keep following #iOS?
Tags are useful for related tools, specific problems, and similar troubleshooting notes.
View same tagWant to explore another direction?
If you are not sure what to read next, return to the homepage and start from categories, topics, or latest updates.
Back home