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

目錄

第1題:將整數轉換爲兩個無零整數的和

第2題:一週中的第幾天

第3題:把二叉搜索樹轉換爲累加樹

第4題:連續字符

第5題:拿硬幣

第6題:刪除中間節點

第7題:猜數字

第8題:整數的各位積和之差

第9題:一維數組的動態和

第10題:統計位數爲偶數的數字


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

第1題:將整數轉換爲兩個無零整數的和

試題要求如下:

解答思路:

一對一對篩選,若一組數值某個數存在含0組成,則跳過該組。

回答(C語言):

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* getNoZeroIntegers(int n, int* returnSize){
    int i = 1,j = n-1;
    int temp = 0;
    int* data_buf = (int*)malloc((2)*sizeof(int));
    
    while(i<j){
        temp = i;
        while(temp % 10 != 0){
            temp /= 10;
        }
        if(temp != 0){
            i++;
            j--;
            continue;
        }
        
        temp = j;
        while(temp % 10 != 0){
            temp /= 10;
        }
        if(temp != 0){
            i++;
            j--;
            continue;
        } 

        break;      
    }

    data_buf[0] = i;
    data_buf[1] = j;

    *returnSize = 2;
    return data_buf;
}

運行效率如下所示:


第2題:一週中的第幾天

試題要求如下:

解答思路:

1、明確起點1971.1.1 - "Friday", 用最小值避免符號運算;

2、計算從1971.1.1到(day, month, year)的天數, 需要注意中間年份會有閏年, 另外當前年份需要單獨運算;

3、根據天數差值, 對7(一週7天)進行求餘, 並且需要考慮起點是"Friday"(週五)的偏移。

回答(C語言):

char * dayOfTheWeek(int day, int month, int year){
    const char *s[7] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};

    if(year < 1971 || year > 2100) return NULL;

    int daysOfMonth[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

    int sum = 0;
    for(int i = 1971; i < year; i ++)
    {
        if(0 == i % 400 || (0 != i % 100 && 0 == i % 4))
        {
            sum += 366;
        }
        else
        {
            sum += 365;
        }
    }

    if(0 == year % 400 || (0 != year % 100 && 0 == year % 4))
    {
        daysOfMonth[1] = 29;
    }

    for(int i = 0; i < month - 1; i ++)
    {
        sum += daysOfMonth[i];
    }

    sum += day - 1;

    return s[(sum + 5) % 7];
}

運行效率如下所示:


第3題:把二叉搜索樹轉換爲累加樹

試題要求如下:

解答思路:

在遞歸方法中,我們維護一些遞歸調用過程中可以訪問和修改的全局變量。首先我們判斷當前訪問的節點是否存在,如果存在就遞歸右子樹,遞歸回來的時候更新總和和當前點的值,然後遞歸左子樹。如果我們分別正確地遞歸 root.right 和 root.left ,那麼我們就能正確地用大於某個節點的值去更新此節點,然後才遍歷比它小的值。

回答(C語言):

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
static void dfs(struct TreeNode* psRoot, int* pSum)
{
    if (NULL == psRoot)
    {
        return;
    }

    dfs(psRoot->right, pSum);

    *pSum += psRoot->val;
    psRoot->val = *pSum;

    dfs(psRoot->left, pSum);
}

struct TreeNode* convertBST(struct TreeNode* root){
    int sum = 0;
    dfs(root, &sum);
    return root;
}

運行效率如下所示:


第4題:連續字符

試題要求如下:

回答(C語言):

int maxPower(char * s){
    int i,cou = 1,num = 0,len = strlen(s)-1;
    char temp = s[0];

    for(i = 1;i <= len;i++){
        if(temp == s[i]){
            cou++;
            if(cou > num){
                num = cou;
            }
        }
        else{
            cou = 1;
        }

        temp = s[i];
    }

    if(num == 0){
        num = 1;
    }

    return num;
}

運行效率如下所示:


第5題:拿硬幣

試題要求如下:

回答(C語言):

int minCount(int* coins, int coinsSize){
    int cou = 0;
    int temp = 0;

    for(int i = 0;i < coinsSize;i++)
    {
        temp = coins[i];
        while(temp > 0){
            cou++;
            temp -= 2;
        }
    }

    return cou;
}

運行效率如下所示:


第6題:刪除中間節點

試題要求如下:

解答思路:

將node->next指向的地址傳給node,然後釋放掉多餘節點。

注意給出的形參不是頭節點。

回答(C語言):

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
void deleteNode(struct ListNode* node) {
    struct ListNode *t=node->next;
    *node=*t;
    free(t);
}

運行效率如下所示:


第7題:猜數字

試題要求如下:

解答思路:

第一次在力扣做這麼簡單的題,判斷每一位元素是否相等。

回答(C語言):

int game(int* guess, int guessSize, int* answer, int answerSize){
    int cou = 0;
    
    for(int i = 0;i < guessSize;i++){
        if(guess[i] == answer[i]){
            cou++;
        }
    }

    return cou;
}

運行效率如下所示:


第8題:整數的各位積和之差

試題要求如下:

回答(C語言):

int subtractProductAndSum(int n){
    int product = 1,sum = 0;

    for(int i = 0,num = n;num > 0;i++){
        product *= num%10;
        sum += num%10;
        num /= 10;
    }

    return product-sum;
}

運行效率如下所示:


第9題:一維數組的動態和

試題要求如下:

解答思路:

求取前綴和,直接對原數組求取,不用額外分配存儲空間。

回答(C語言):

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int *runningSum(int *nums, int numsSize, int *returnSize)
{
    for(int i = 1;i < numsSize;i++){
        nums[i] = nums[i] + nums[i-1];
    }

    *returnSize = numsSize;
    return nums;
}

運行效率如下所示:


第10題:統計位數爲偶數的數字

試題要求如下:

回答(C語言):

int findNumbers(int* nums, int numsSize){
    int temp = 0,cou = 0,data = 0;

    for(int i = 0;i < numsSize;i++){
        temp = nums[i];
        while(temp > 0)
        {
            cou++;
            temp /= 10;
        }

        if(cou%2 == 0){
            data++;
        }

        cou = 0;
    }

    return data;
}

運行效率如下所示:

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