力扣(LeetCode)刷題,簡單題(第14期)

目錄

第1題:配對交換

第2題:比較字符串最小字母出現頻次

第3題:交替位二進制

第4題:二進制間距

第5題:最後一塊石頭的重量

第6題:旋轉數字

第7題:十進制整數的反碼

第8題:連續子數組的最大和

第9題:有序數組中出現次數超過25%的元素

第10題:數組中字符串匹配


力扣(LeetCode)定期刷題,每期10道題,業務繁重的同志可以看看我分享的思路,不是最高效解決方案,只求互相提升。

第1題:配對交換

試題要求如下:

解答思路:

分別取出num的偶數位與奇數位

然後讓偶數位右移一位奇數位左移一位

讓移位後的偶數與奇數異或即可得最終結果

回答(C語言):

int exchangeBits(int num){
    int even_number = 0xaaaaaaaa;    //1010 1010 ...... 取出偶數
    int uneven_number = 0x55555555;  //0101 0101 ...... 取出奇數

    even_number = num & even_number;
    uneven_number = num & uneven_number;

    even_number = even_number >> 1;
    uneven_number = uneven_number << 1;

    return even_number | uneven_number;
}

運行效率如下所示:


第2題:比較字符串最小字母出現頻次

試題要求如下:

解答思路:

回答(C語言):

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
#define NUM 26
int QureySmallWord (char *str, int *hash)
{
    memset(hash, 0, NUM * sizeof(int));
    int len = strlen(str);
    int res = 0;
    for (int i = 0; i < len; i++) {
        // 統計字符串中各個字符出現的頻次,已默認是字典序
        hash[str[i] - 'a']++;
    }
    for (int i = 0; i < NUM; i++) {
        // 獲取字符串中最小字母的出現頻次,即hash表中第一個非零值
        if (hash[i] > 0) {
            res = hash[i];
            break;
        }
    }
    //printf("res %d\n", res);
    return res;
}
int* numSmallerByFrequency(char ** queries, int queriesSize, char ** words, int wordsSize, int* returnSize){
    int *array_q = (int *)malloc(queriesSize * sizeof(int));
    int *array_w = (int *)malloc(wordsSize * sizeof(int));
    int *hash = (int *)malloc(NUM * sizeof(0));
    // queries各個字符串(按字典序比較)最小字母的出現頻次
    for (int i = 0; i < queriesSize; i++) {
        array_q[i] = QureySmallWord(queries[i], hash);
    }
    // words各個字符串(按字典序比較)最小字母的出現頻次
    for (int i = 0; i < wordsSize; i++) {
        array_w[i] = QureySmallWord(words[i], hash);
    }
    // 依次查找queries中字符串滿足f(queries[i]) < f(W[0..j])的個數
    int *res = (int *)malloc(queriesSize * sizeof(int));
    int count = 0;
    for (int i = 0; i < queriesSize; i++) {
        int temp = 0;
        for (int j = 0; j < wordsSize; j++) {
            //printf("array_q[%d] %d  array_w[%d] %d", i, array_q[i], j, array_w[j]);
            if (array_q[i] < array_w[j]) {
                temp++;
            }
        }
        res[count++] = temp;
    }
    *returnSize = count;
    return res;
}

運行效率如下所示:


第3題:交替位二進制

試題要求如下:

解答思路:

每次用 n&1 位運算取出最後一位,並與上一次取出的最後一位比較,一樣的話返回false。

回答(C語言):

bool hasAlternatingBits(int n){
    int pre = n & 1; 
    n >>= 1;

    while (n != 0) {
        if ((n & 1) == pre) {
            return false;
        }
        pre = n & 1;
        n >>= 1;
    }
    
    return true;
}

運行效率如下所示:


第4題:二進制間距

試題要求如下:

解答思路:

1、利用 1 與數字N進行&運算檢查二進制第一位是否爲1;

2、逐步將數字二進制值向右移動一位:N = N>>1;

3、N <= 0 時終止。

回答(C語言):

int binaryGap(int N){
    int distance = 0, max = 0,distanceon = 0; 

    while (N > 0){
        if((N & 1) != 0){
            distanceon = 1;

            if(distance > max){
                max = distance;
            }

            distance = 0;
        }

        distance+=(distanceon);
        N = N >> 1;
    }
    
    return max;
}

運行效率如下所示:


第5題:最後一塊石頭的重量

試題要求如下:

解答思路:

1、5個石頭撞四次 6個石頭撞5次 N個石頭撞N-1次;

2、降序,撞前兩個。得到的新石頭放回去,空缺位置置0;

3、重複第二步;

4、最後剩下一個,就是答案。

回答(C語言):

int Cmp(const void* a, const void* b)
{
    return *(int*)b - *(int*)a;
}

int lastStoneWeight(int* stones, int stonesSize)
{
    int time = stonesSize - 1;
    int buf[30] = {0};
    memcpy(buf, stones, stonesSize * sizeof(int));

    while (time > 0) {
        qsort(buf, 30, sizeof(int), Cmp);
        buf[0] -= buf[1];
        buf[1] = 0;
        time--;
    }
    
    return buf[0];
}

運行效率如下所示:


第6題:旋轉數字

試題要求如下:

解答思路:

遍歷從 1 到 N 的每個數字 X,判斷 X 是否爲好數。如果 X 中存在 3、4、7 這樣的無效數字,則 X 不是一個好數。如果 X 中不存在 2、5、6、9 這樣的旋轉後會變成不同的數字,則 X 不是一個好數。否則,X 可以旋轉成一個不同的有效數字。

回答(C語言):

/*
* 函數功能:檢測是否是好數;是好數返回1,否則返回0 
* 函數輸入:當前檢測的數num
* 函數返回值:0或1
*/
int CheckDigits(int num)
{
    int rest;
    int flag = 0;

    while(num > 0) {
        rest = num % 10;
        /* 遇到垃圾數直接返回0 */
        if (rest == 3 || rest == 4 || rest == 7) {
            return 0;
        }
        /* 遇到有可能存在的好數先標記一下 */
        if (rest == 2 || rest == 5 || rest == 6 || rest == 9) {
            flag = 1;
        }
        num = num / 10;
    }
    
    /* 如果不存在垃圾數,且有好數則統計加1 */
    if (flag == 1) {
        return 1;
    }

    return 0;
}
int rotatedDigits(int N){
    int ret = 0;
    for (int i = 1; i <= N; i++) {
        /* 逐個檢測,好數就加1 */
        ret += CheckDigits(i);
    }
    return ret;
}

運行效率如下所示:


第7題:十進制整數的反碼

試題要求如下:

解答思路:

舉個例子 6是110 那麼他的反碼是他與111異或得到的001。所以找到比N大的每位都爲1的數,與N進行異或。

回答(C語言):

int bitwiseComplement(int N){
    int num = 1;

    while(num < N){
        num = (num << 1) + 1;
    }
    
    return N ^ num;
}

運行效率如下所示:


第8題:連續子數組的最大和

試題要求如下:

解答思路:

動態規劃:

回答(C語言):

int maxSubArray(int* nums, int numsSize){
    int sum=nums[0],max=nums[0];
    
    for(int i=1;i<numsSize;i++)
    {
        sum=(sum>0)?(sum+nums[i]):nums[i];
        max=(max>sum)?max:sum;   
    }

    return max;
}

運行效率如下所示:


第9題:有序數組中出現次數超過25%的元素

試題要求如下:

回答(C語言):

int findSpecialInteger(int* arr, int arrSize){
    int i = 1,cou = 0;
    int temp = arr[0];

    while(i < arrSize){
        if(temp == arr[i]){
            cou++;

            if(cou*4 >= arrSize){
                break;
            }
        } 
        else{
            cou = 0;
        }

        temp = arr[i];
        i++;
    }

    return temp;
}

運行效率如下所示:


第10題:數組中字符串匹配

試題要求如下:

解答思路:

C語言使用strstr庫函數來進行子字符串匹配。strstr(str1,str2) 函數用於判斷字符串str2是否是str1的子串。如果是,則該函數返回 str1字符串從 str2第一次出現的位置開始到 str1結尾的字符串;否則,返回NULL。

回答(C語言):

char ** stringMatching(char ** words, int wordsSize, int* returnSize){
    if ((words == NULL) || (wordsSize <= 0)) {
        *returnSize = 0;
        return NULL;
    }

    char** res = (char**)malloc(sizeof(char*) * wordsSize);
    int index = 0;

    for (int i = 0; i < wordsSize; i++) {
        for (int j = 0; j < wordsSize; j++) {
            if (i != j) {
                if (strstr(words[j], words[i])) {
                    res[index] = (char*)malloc(sizeof(char) * (strlen(words[i]) + 1));
                    memcpy(res[index], words[i], strlen(words[i]) + 1);
                    index++;
                    break;
                }
            }
        }
    }

    *returnSize = index;
    return res;

}

運行效率如下所示:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章