Back home

الفنون رقم 022

الفنون رقم 022

ARTS هو نشاط بدأه 由左耳朵耗子--陈皓: قم بإجراء سؤال واحد على الأقل عن خوارزمية leetcode كل أسبوع، واقرأ مقالًا تقنيًا واحدًا على الأقل باللغة الإنجليزية وعلق عليه، وتعلم مهارة فنية واحدة على الأقل، وشارك المقالة مع الآراء والأفكار. (أي أن الخوارزمية والمراجعة والنصائح والمشاركة يشار إليها باسم ARTS) وتستمر لمدة عام واحد على الأقل.

الفنون 022

هذه المادة 22

سؤال خوارزمية الخوارزمية

648. استبدال الكلمات

الصعوبة متوسطة

في اللغة الإنجليزية، لدينا مفهوم يسمى root، والذي يمكن أن تتبعه بعض الكلمات الأخرى لتكوين كلمة أخرى أطول - دعنا نسمي هذه الكلمة successor. على سبيل المثال، الجذر an، متبوعًا بـ other، والذي يمكن أن يشكل كلمة أخرى another.

والآن، لدينا قاموس يتكون من العديد من الجذور والجملة. أنت بحاجة إلى استبدال كل successor في الجملة بـ root التي تشكلها. إذا كان successor يحتوي على العديد من roots التي يمكن تكوينها، فاستبدله بالجذر الأقصر طولًا.

تحتاج إلى إخراج الجملة بعد الاستبدال.

مثال 1:

ملاحظة:

Input: dict = ["cat", "bat", "rat"]
sentence = "the cattle was rattled by the battery"
Output: "the cat was rat by the bat"

الحل

اللغة: ج


/**判断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;
}

مراجعة

https://dandan2009.github.io/2018/12/28/exposing-NSDictionary/

نصائح

تم فتح مصدرين للتحكم هذا الأسبوع: لافتة تمرير دائرية مخصصة للغاية: https://github.com/dandan2009/DDCircleScrollViewBanner التحكم في النافذة المنبثقة، يدعم النص والصور والرسومات والنوافذ المنبثقة المخصصة للعرض: https://github.com/dandan2009/DDPopUpView

شارك

لقد طرحت اليوم سؤالاً على أحد المحاورين: لماذا يحتاج AF2.x إلى سلاسل رسائل مقيمة؟

وهذا ما يفعله هذا الكود:

+ (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;
}

ونتيجة لذلك، قدم العديد من الأشخاص الذين تمت مقابلتهم إجابات غير صحيحة، كما كانت العديد من الإجابات على الإنترنت غير صحيحة أيضًا. هنا ملخص:

يستخدم AF2.x NSURLConnection لبدء طلبات الشبكة. تم تصميم NSURLConnection ليتم إرساله بشكل غير متزامن. بعد استدعاء طريقة البدء، سيقوم NSURLConnection بإنشاء بعض سلاسل الرسائل الجديدة واستخدام CFSocket الأساسي لإرسال الطلبات واستقبالها. بعد إرسال بعض الأحداث واستلامها، يتم إخطار Runloop للسلسلة الأصلية بإعادة الاتصال بالحدث. ولكن ربما تم إصدار الخيط الأصلي.

من أجل ضمان عدم تحرير مؤشر الترابط الأصلي ولضمان الاستقبال العادي لأسلوب رد الاتصال NSURLConnectionDelegate، من الضروري فتح مؤشر ترابط لكل طلب وإبقاء مؤشر الترابط حيًا. هناك عدد كبير جدًا من الخيوط التي يجب الحفاظ عليها، والحمل مرتفع جدًا. لذلك ما عليك سوى الحفاظ على سلسلة الرسائل الثابتة حية، وبدء الطلبات وتلقي عمليات الاسترجاعات في سلسلة الرسائل هذه.