ARTES #022
ARTES #022
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 022 este es el articulo 22
Pregunta sobre el algoritmo del algoritmo
648. Reemplazar palabras
Dificultad Media
En inglés, tenemos un concepto llamado root, que puede ir seguido de otras palabras para formar otra palabra más larga; llamemos a esta palabra successor. Por ejemplo, la raíz an, seguida de other, que puede formar otra palabra another.
Ahora, dado un diccionario que consta de muchas raíces y una oración. Debe reemplazar todos los successor en la oración con el root que la forma. Si un successor tiene muchos roots que pueden formarlo, reemplácelo con la raíz con la longitud más corta.
Debe generar la oración después del reemplazo.
Ejemplo 1:
Nota:
Input: dict = ["cat", "bat", "rat"]
sentence = "the cattle was rattled by the battery"
Output: "the cat was rat by the bat"
Solución
Idioma: C
/**判断str1是否以str2开头
* 如果是返回1
* 不是返回0
* 出错返回-1
* */
int is_begin_with(const char * str1,char *str2){
if(str1 == NULL || str2 == NULL)
return -1;
int len1 = strlen(str1);
int len2 = strlen(str2);
if((len1 < len2) || (len1 == 0 || len2 == 0))
return -1;
char *p = str2;
int i = 0;
while(*p != '\0')
{
if(*p != str1[i])
return 0;
p++;
i++;
}
return 1;
}
/*方法,调用C库函数,*/
char* join(char *s1, char *s2){
char *result = malloc(strlen(s1)+strlen(s2)+1);//+1 for the zero-terminator
if (result == NULL)
return NULL;
strcpy(result, s1);
strcat(result, s2);
return result;
}
char* replaceWords(char** dict, int dictSize, char* sentence) {
int i = 0;
//先处理dict,把dict中词根 处理为最短词根
while (i < dictSize) {
char* str2 = dict[i];
if (str2 == NULL) {
i++;
continue;
}
int j = i+1;
while (j < dictSize) {
char* str1 = dict[j];
if (str1 == NULL) {
j++;
continue;
}
if (strcmp(str1, str2) == 0) {
dict[j] = NULL;
j++;
continue;
}
if (is_begin_with(str1,str2)==1) {
dict[j] = NULL;
j++;
}
j++;
}
i++;
}
//分割字符串进行替换
char * re = "";
char * pch = strtok(sentence, " ");
while (pch != NULL){
if (strlen(re) > 0){
re = join(re," ");
};
int j=0;
while (j < dictSize) {
char* str1 = dict[j];
if (str1 == NULL) {
j++;
continue;
}
if ((strcmp(pch, str1) != 0) && (is_begin_with(pch,str1)==1)) {
pch = str1;
break;
}
j++;
}
re = join(re,pch);
pch = strtok(NULL, " ");
}
return re;
}
Revisión
https://dandan2009.github.io/2018/12/28/exposing-NSDictionary/
CONSEJOS
Esta semana se abrieron dos controles: Banner de desplazamiento circular altamente personalizado: https://github.com/dandan2009/DDCircleScrollViewBanner Control de ventana emergente, admite texto, imágenes, gráficos y ventanas emergentes de vista personalizada: https://github.com/dandan2009/DDPopUpView
Compartir
Hoy le hice una pregunta a un entrevistador: ¿Por qué AF2.x necesita subprocesos residentes?
Eso es lo que hace este código:
+ (void)networkRequestThreadEntryPoint:(id)__unused object {
@autoreleasepool {
[[NSThread currentThread] setName:@"AFNetworking"];
NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
[runLoop addPort:[NSMachPort port] forMode:NSDefaultRunLoopMode];
[runLoop run];
}
}
+ (NSThread *)networkRequestThread {
static NSThread *_networkRequestThread = nil;
static dispatch_once_t oncePredicate;
dispatch_once(&oncePredicate, ^{
_networkRequestThread =
[[NSThread alloc] initWithTarget:self
selector:@selector(networkRequestThreadEntryPoint:)
object:nil];
[_networkRequestThread start];
});
return _networkRequestThread;
}
Como resultado, varios entrevistados dieron respuestas incorrectas y muchas respuestas en Internet también fueron incorrectas. Aquí hay un resumen:
AF2.x usa NSURLConnection para iniciar solicitudes de red. NSURLConnection está diseñado para enviarse de forma asincrónica. Después de llamar al método de inicio, NSURLConnection creará algunos subprocesos nuevos y utilizará el CFSocket subyacente para enviar y recibir solicitudes. Después de enviar y recibir algunos eventos, se notifica al Runloop del hilo original para que devuelva la llamada al evento. Pero es posible que el hilo original haya sido publicado.
Para garantizar que el hilo original no se libere y garantizar la recepción normal del método de devolución de llamada NSURLConnectionDelegate, es necesario abrir un hilo para cada solicitud y mantenerlo vivo. Hay demasiados subprocesos para mantener vivos y los gastos generales son demasiado altos. Por lo tanto, solo necesita mantener vivo un hilo fijo, iniciar solicitudes y recibir devoluciones de llamadas en este hilo.
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