Back home

SENI #022

SENI #022

SENI adalah kegiatan yang diprakarsai oleh 由左耳朵耗子--陈皓: Kerjakan setidaknya satu pertanyaan algoritma leetcode setiap minggu, baca dan komentari setidaknya satu artikel teknis berbahasa Inggris, pelajari setidaknya satu keterampilan teknis, dan bagikan artikel yang berisi opini dan pemikiran. (Artinya, Algoritma, Review, Tip, dan Share disebut sebagai SENI) dan bertahan setidaknya selama satu tahun.

SENI 022

Ini adalah pasal 22

Pertanyaan algoritma algoritma

648. Ganti Kata

Tingkat Kesulitan Sedang

Dalam bahasa Inggris, kita mempunyai konsep yang disebut root, yang dapat diikuti oleh beberapa kata lain untuk membentuk kata lain yang lebih panjang - sebut saja kata ini successor. Misalnya akar kata an, diikuti other, yang dapat membentuk kata lain another.

Sekarang, diberikan kamus yang terdiri dari banyak akar dan satu kalimat. Anda perlu mengganti semua successor dalam kalimat dengan root yang membentuknya. Jika successor mempunyai banyak roots yang dapat membentuknya, gantilah dengan root yang panjangnya paling pendek.

Anda perlu mengeluarkan kalimat setelah penggantian.

Contoh 1:

Catatan:

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

Solusi

Bahasa: 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;
}

Ulasan

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

TIPS

Dua kontrol bersumber terbuka minggu ini: Spanduk gulir melingkar yang sangat disesuaikan: https://github.com/dandan2009/DDCircleScrollViewBanner Kontrol jendela pop-up, mendukung teks, gambar, grafik, dan pop-up tampilan khusus: https://github.com/dandan2009/DDPopUpView

Bagikan

Hari ini saya mengajukan pertanyaan kepada pewawancara: Mengapa AF2.x memerlukan thread tetap?

Itulah yang dilakukan kode ini:

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

Akibatnya, beberapa orang yang diwawancarai memberikan jawaban yang salah, dan banyak jawaban di Internet juga salah. Berikut ringkasannya:

AF2.x menggunakan NSURLConnection untuk memulai permintaan jaringan. NSURLConnection dirancang untuk dikirim secara asinkron. Setelah memanggil metode start, NSURLConnection akan membuat beberapa thread baru dan menggunakan CFSocket yang mendasarinya untuk mengirim dan menerima permintaan. Setelah beberapa peristiwa dikirim dan diterima, Runloop dari thread asli diberitahu untuk memanggil kembali peristiwa tersebut. Tapi thread aslinya mungkin sudah dirilis.

Untuk memastikan bahwa thread asli tidak dilepaskan dan untuk memastikan penerimaan normal metode panggilan balik NSURLConnectionDelegate, maka perlu membuka thread untuk setiap permintaan dan menjaga thread tetap hidup. Ada terlalu banyak thread yang harus dipertahankan, dan biaya overhead terlalu tinggi. Jadi, Anda hanya perlu menjaga agar thread tetap tetap hidup, memulai permintaan, dan menerima panggilan balik di thread ini.