Back home

SENI #019

SENI #019

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 019

Ini adalah pasal 19

Pertanyaan algoritma algoritma

804. Kata Kode Morse Unik

Kesulitan Mudah

Kode Morse Internasional mendefinisikan pengkodean standar di mana setiap huruf dipetakan ke serangkaian titik dan garis, sebagai berikut: "a" dipetakan ke ".-", "b" dipetakan ke "-...", "c" dipetakan ke "-.-.", dan seterusnya.

Untuk memudahkan, tabel lengkap untuk 26 huruf alfabet Inggris diberikan di bawah ini:

[".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--.."]

Sekarang, dengan adanya daftar kata, setiap kata dapat ditulis sebagai rangkaian kode Morse setiap huruf. Misalnya, “cba” dapat ditulis sebagai “-.-…–…”, (yang merupakan gabungan “-.-.” + “-…” + “.-”). Kita akan menyebutnya rangkaian seperti itu, transformasi sebuah kata.

Mengembalikan jumlah transformasi berbeda di antara semua kata yang kita miliki.



Example:
Input: words = ["gin", "zen", "gig", "msg"]
Output: 2
Explanation: 
The transformation of each word is:
"gin" -> "--...-."
"zen" -> "--...-."
"gig" -> "--...--."
"msg" -> "--...--."

There are 2 different transformations, "--...-." and "--...--.".

Catatan:

  • Panjang kata paling banyak 100.
  • Setiap kata[i] akan memiliki panjang dalam rentang [1, 12].
  • kata[i] hanya akan terdiri dari huruf kecil.

Solusi

Bahasa: C

Metode 1: Ini adalah metode termudah untuk dipikirkan, langsung mengubah kata menjadi Morma, lalu membandingkan dan menghapus duplikasi

int uniqueMorseRepresentations(char** words, int wordsSize) {
    char *morse[26] = {".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--.."};
    
    
    //convert words to morse
    char **chatToMorse = (char **)malloc(sizeof(char*) * wordsSize);
    int index = 0;
    while (index < wordsSize) {
        char *word = words[index];
        char *charMorse = NULL;
        for (int j = 0; j <  strlen(word); j++) {
            char charter = word[j];
            char *newmorse = morse[charter - 'a'];
            
            if (charMorse == NULL) {
                char *result = malloc(strlen(newmorse)+1);
                memset(result, '\0', strlen(newmorse)+1);
                strcpy(result, newmorse);
                charMorse = result;
            }
            else{
                char *result = malloc(strlen(charMorse)+strlen(newmorse)+1);//+1 for the zero-terminator
                memset(result, '\0', strlen(charMorse)+strlen(newmorse)+1);
                strcpy(result, charMorse);
                strcat(result, newmorse);
                free(charMorse);
                charMorse = result;
            }
        }
        chatToMorse[index] = charMorse;
        ++index;
    }
    
    int falg = 0;
    for (int m =0; m < wordsSize; m++) {
        char *  ms = chatToMorse[m];
        if(ms == NULL){
            continue;
        }
        for(int n = m+1; n <wordsSize;n++ ){
            char *  ns = chatToMorse[n];
            if (ns != NULL)  {
                int res = strcmp(ms,ns);
                if (res ==0) {
                    chatToMorse[n] = NULL;
                    falg++;
                }
            }
        }
    }
    return wordsSize -falg;
}

Metode 2: Ide metode ini sama dengan ide saya tetapi lebih cepat dari ide saya. Seharusnya karena tidak mengalokasikan memori secara dinamis. Hal lainnya adalah perhitungan deduplikasi akhir berbeda dengan perhitungan saya. Tetapi kode ini lebih baik daripada kode saya karena merangkum berbagai fungsi dalam kode dan memiliki pemikiran berorientasi objek.


char *transMorse(const char alphabet){
    char *morseCode[] = { ".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--.." };
    return morseCode[alphabet-'a'];
}

void transMorseString(char *word, char *morseString){
    char *morseTempt;
    while(*word){
        morseTempt = transMorse(*word);
        word++;
        while(*morseTempt){
            *morseString = *morseTempt;
            morseString++;
            morseTempt++;
        }
    }
    return;
}

int uniqueMorseRepresentations(char** words, int wordsSize) {
    char morseString[100][50] = {""};
    
    for(int i = 0 ; i<wordsSize ; ++i){
        transMorseString(words[i], morseString[i]);
    }
    
    //上面的方法h都好理解,就是把字符串转为Morse码
    //下面的这个去重计算 感觉不好理解
    for(int i = 0 ; i<wordsSize ; ++i){
        for(int j = i+1 ; j<wordsSize ; ++j){
            while(wordsSize>1 && j<wordsSize && !strcmp(morseString[i], morseString[j])){
                strcpy(morseString[j], morseString[wordsSize-1]);
                --wordsSize;
            }
        }
    }
    return wordsSize;
}


Metode 3: Keuntungan dari metode ini:

  1. Lebih mudah menggunakan metode dua dimensi saat mengonversi string menjadi kode Moral.
  2. Konsep himpunan digunakan saat menghilangkan duplikat

Terutama poin 2, ide berkumpul, bukankah situasi di mana berkumpul berguna, tapi saya tidak menyangka.


int addToSet(char** set, int setCount, char* buf);

int uniqueMorseRepresentations(char** words, int wordsSize) {
    char* morse[26] = {".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--.."};
    char* set[100];
    int setCount = 0;
    //1. 字符串转摩尔码的时候用了二维方法的时候 比较方便
    //2. 去重的时候用到了集合(set)的概念
    int i = 0;
    for(i = 0; i < wordsSize; i++) {
        char* buf = malloc(sizeof(char) * 60);
        buf[0] = '\0';
        int j = 0;
        for(j = 0; j < strlen(words[i]); j++) {
            char* cat = strcat(buf, morse[words[i][j] - 97]);
            
            printf("add: %c %s, all is: %s", words[i][j], morse[words[i][j] - 97], cat);
        }
        setCount = addToSet(set, setCount, buf);
        printf("\n");
    }
    
    for(i = 0; i < setCount; i++) {
        free(set[i]);
    }
    
    return setCount;
}

int addToSet(char** set, int setCount, char* buf) {
    int i = 0;
    for(i = 0; i < setCount; i++) {
        printf("compare: %s %s", set[i], buf);
        if(strcmp(set[i], buf) == 0) {
            return setCount;
        }
    }
    
    set[i] = buf;
    return ++i;
}



Metode 4: Ide metode ini juga sangat bagus. Bayangkan Morma sebagai biner 0 dan 1,. mewakili 0, dan 1 mewakili -. Lihat komentar kode untuk detailnya


typedef struct {
    char len;
    char val;
} morseCode;

morseCode codeTable[] = {
    {2, 2}, /* a .-   10*/
    {4, 7}, /* b -... 0111*/
    {4, 5}, /* c -.-. 0101 */
    {3, 3},
    {1, 1},
    {4,13},
    {3, 1},
    {4,15},
    {2, 3},
    {4, 8},
    {3, 2},
    {4,11},
    {2, 0},
    {2, 1},
    {3, 0},
    {4, 9},
    {4, 2},
    {3, 5},
    {3, 7},
    {1, 0},
    {3, 6},
    {4,14},
    {3, 4},
    {4, 6},
    {4, 4},
    {4, 3}
};

typedef struct{
    int len;
    int val;
}morseString;

morseString getmorseString(char* s) {
    morseString str;
    str.len = 0;
    str.val = 0;

    char *p = s;
    while(*p != '\0')
    {
        char c = *p;
        if (c < 'a' || c > 'z'){
            printf("Invalid input *p = %c\n", c);
            p++;
            continue;
        }

        morseCode code = codeTable[c - 'a'];
        str.len += code.len;//记录单词转为摩尔码,也就是二进制之后的位数,当数据很长时有用,如果数据较短,比如没有超过64位或32位。但是超过之后这个就有用了
        str.val = (str.val << (code.len)) + code.val;//把str.val看成二进制数据 就容易理解了
        p++;
    }

    return str;
}

int uniqueMorseRepresentations(char** words, int wordsSize) {
    int result = -1;
    morseString stack[100];

    for(int i = 0; i < wordsSize; i++)
    {
        morseString str = getmorseString(words[i]);
        bool foundone = false;
        for (int j = 0; j <= result; j++)
        {
            // check one by one if str in stack
            // zstack[j].len == str.len 这个判断当摩尔码的二进制长度超过机器的最大字长时才有用。
            // 如果没有超过最大字长,二进制表示相等(stack[j].val == str.val),二进制的长度必然相等
            if (stack[j].len == str.len && stack[j].val == str.val) {
                foundone = true;
                break;
            }
        }

        if (!foundone)
        {
            stack[++result] = str;
        }
    }

    return result + 1;
}


Metode 5: Metode yang lebih memuaskan, menggunakan array dua dimensi, yang lebih sederhana daripada metode penulisan saya.


int uniqueMorseRepresentations(char** words, int wordsSize) {
    char transBuffer[50] = {0};
    char transCode[100][50] = {0}; //Store the translation code
    char* morseCode[] = {".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--.."}; // 'a' ~ 'z' Morse Code Table
    
    int j, k;
    int existFlag = 0;
    int transCodeNum = 0;               //Different translation code numbers
    for(int i=0; i < wordsSize; i++)
    {
        j = 0;
        k = 0;
        existFlag = 0;                                      //Reset the flag
        memset(transBuffer, 0, sizeof(transBuffer));        //Reset the buffer
        while(words[i][j] != '\0')
        {
            k = words[i][j] - 'a';                          //get the number of letters
            strncat(transBuffer, morseCode[k], sizeof(morseCode[k]));   //translate the letter by morseCode
            j++;
        }
        
        
        for(int z = 0; z < transCodeNum && !existFlag; z++)     //Confirm transCode has already store same code
            if(strncmp(transCode[z], transBuffer, sizeof(transBuffer)) == 0)
                existFlag = 1;
        
        if(!existFlag)                                          //if the code isn't exist, store it
            strncpy(transCode[transCodeNum++], transBuffer, sizeof(transBuffer));
        
    }
    
    return transCodeNum;
}

Ulasan

Artikel ini berisi uraian tentang: Cara menjadi pengembang perangkat lunak yang lebih baik Berbicara tentang hal-hal selain keterampilan pengembangan: 1 Memahami keseluruhan proses pengembangan. Disarankan agar pengembang tidak hanya fokus pada pengkodean, tetapi juga memahami keseluruhan proses pengembangan, proses konversi dari ide yang tidak jelas menjadi solusi yang dirancang dengan cermat, serta pengujian, penerapan, pemantauan, analisis, dan peningkatan setelah pengembangan perangkat lunak selesai. Hal ini memungkinkan setiap orang untuk saling memahami dan mengurangi hambatan komunikasi yang disebabkan oleh saling memahami karya orang lain. 2 Memahami kebutuhan pelanggan, berkomunikasi dengan pelanggan, mencapai rasa saling percaya, dan memberikan umpan balik tepat waktu mengenai kemajuan dan hasil kepada pelanggan. 3 Pilih solusi atau alat yang berbeda untuk pekerjaan yang berbeda, dan tidak dapat menggunakan keterampilan dan pengalaman yang ada untuk semuanya. 4. Berdiri di pundak para raksasa dan pandai menggunakan alat pihak ketiga alih-alih mengembangkannya dari awal setiap saat. 5. Untuk mempelajari prinsip dasar ilmu, tidak bisa begitu saja mengejar ilmu baru. Anda harus memahami prinsip di balik pengetahuan tersebut.

Untuk terjemahan lihat: https://dandan2009.github.io/2018/12/18/how-to-become-a-better-software-developer/ Lihat teks aslinya: https://medium.com/devtrailsio/how-to-become-a-better-software-developer-dd16072c974e

Kiat

Sebelumnya, Instrumen digunakan untuk menguji waktu startup APP. Itu hanya bisa merekam peristiwa eksekusi metode tertentu. Sekarang Anda dapat menggunakan Signposts untuk mencatat waktu berjalan setiap baris kode APP: Lihat WWDC2018 Mengukur Kinerja Menggunakan Logging: https://developer.apple.com/videos/play/wwdc2018/405/

Berikut terjemahannya yang bisa Anda baca: https://blog.csdn.net/tugele/article/details/81252603

Contoh yang diberikan di atas didasarkan pada Swift, dan versi bahasa C dapat digunakan di Objective-C:

  os_log_t log = os_log_create("com.example.your-app",  "RefreshOperations");
  os_signpost_id_t log_t = os_signpost_id_generate(log);
  
   os_signpost_interval_begin(log, log_t, "Fetch Asset");
   你的代码
   os_signpost_interval_end(log, log_t, "Fetch Asset");
   
   os_signpost_interval_begin(log, log_t, "Fetch Asset1");
   你的代码
   os_signpost_interval_end(log, log_t, "Fetch Asset1");

Bagikan

Kutipan Rekrutmen: https://readhub.cn/jobs

Google Cendekia, Wikipedia, Google Terjemahan, web Gmail, Google Foto, Google Dokumen, Google Keep, Google Earth, Google Buku, Sinkronisasi Chrome, Pixiv, Komunitas Steam, Rilis GitHub, Pinterest, Vimeo, Yandex, Tumbl YouTube, Twitter, Facebook, Google+, Google Play, Google Drive, Blogger, beberapa situs berita, Instagram

Pembelajaran bahasa Inggris: https://learnamericanenglishonline.com/Red Level/R1 Do.html

Dekripsi Runloop: http://mrpeak.cn/blog/ios-runloop/

pemutar sumber terbuka mac: 15.000 bintang, IINA adalah pemutar video modern untuk macOS. https://github.com/lhc70000/iina

Contoh menghasilkan uang melalui program kecil yang dikembangkan: https://www.v2ex.com/t/515777

Dapat mengakses Google: https://sss.cnsdhh.com/

Website untuk mencari warna: https://picular.co/,搜索出来的颜色是一个色系的,不是单一的一种颜色