写点什么

力扣 (LeetCode) 刷题,简单题 (第 15 期)

发布于: 2021 年 03 月 22 日
力扣(LeetCode)刷题,简单题(第15期)

力扣(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;}
复制代码


运行效率如下所示



发布于: 2021 年 03 月 22 日阅读数: 7
用户头像

【研究方向】物联网、嵌入式、AI、Python 2018.02.09 加入

【公众号】美男子玩编程

评论

发布
暂无评论
力扣(LeetCode)刷题,简单题(第15期)