写点什么

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

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

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


第 1 题:字符的最短距离


试题要求如下:



解答思路:


从左向右遍历,记录上一个字符 C 出现的位置 prev,那么答案就是 i - prev。


从右想做遍历,记录上一个字符 C 出现的位置 prev,那么答案就是 prev - i。


这两个值取最小就是答案。


回答(C 语言):


/** * Note: The returned array must be malloced, assume caller calls free(). */int* shortestToChar(char * S, char C, int* returnSize){    int tmp1,tmp2;    int len = strlen(S);    int* ret = (int *)malloc(len * sizeof(int));     for(int i = 0; i < len; i++)    {        tmp1 = 0;        for(int j = i; j >= 0; j--)        {            if (S[j] != C) {                if (j == 0) {                    tmp1 = len;                } else {                    tmp1++;                }            } else {                break;            }        }         tmp2 = 0;        for(int j = i; j < len; j++)        {            if (S[j] != C) {                if (j == len-1) {                    tmp2 = len;                } else {                    tmp2++;                }            } else {                break;            }        }         ret[i] = tmp1 < tmp2 ? tmp1 : tmp2;    }     *returnSize = len;    return ret;}
复制代码


运行效率如下所示:





第 2 题:棒球比赛


试题要求如下:



解答思路:


堆栈思想。


回答(C 语言):


int calPoints(char ** ops, int opsSize){    int arr[1000]={0};    int score = 0,i = 0,j = 0;     while(i < opsSize){        switch(ops[i][0]){            case 'C':                arr[j-1]=0;                j-=2;                break;             case 'D':                arr[j]=arr[j-1]*2;                break;             case '+':                arr[j]=arr[j-1]+arr[j-2];                break;             default:                //字符串类型转整数类型                arr[j]=atoi(ops[i]);                break;        }         j++;        i++;    }     for(int i=0;i<j;i++){        score+=arr[i];    }     return score;}
复制代码


运行效率如下所示:





第 3 题:判定是否互为字符重排


试题要求如下:



回答(C 语言):


bool CheckPermutation(char* s1, char* s2){    int i = 0,j = 0,s1Len = 0,s2Len = 0;    s1Len=strlen(s1);    s2Len=strlen(s2);     if(s1Len != s2Len){         return false;    }     char letter[26]={0};     for(i=0;i<s1Len;i++){       letter[s1[i]-'a']++;    }     for(i=0;i<s2Len;i++){       letter[s2[i]-'a']--;    }     for(i=0;i<26;i++){        if(letter[i]!=0){           return false;        }    }     return true;}
复制代码


运行效率如下所示:





第 4 题:岛屿的周长


试题要求如下:



解答思路:


每个岛+4 周围四个方向有岛屿则-1。


回答(C 语言):


int islandPerimeter(int** grid, int gridSize, int* gridColSize){    int circle = 0;        for (int i = 0; i < gridSize; i++) {        for (int j = 0; j < (*gridColSize); j++) {            if (grid[i][j] == 1) {                circle +=4;                if (i > 0 && grid[i-1][j] == 1) {                    circle--;                }                if ((i + 1) < gridSize && grid[i + 1][j] == 1){                    circle--;                }                if (j > 0 && grid[i][j - 1] == 1) {                    circle--;                }                if ((j + 1) < (*gridColSize) && grid[i][j + 1] == 1){                    circle--;                }            }        }            }     return circle;}
复制代码


运行效率如下所示:





第 5 题:两个数组的交集


试题要求如下:



解答思路:


使用哈希表查询:对数组 1 进行映射,将数组元素作为下标,对散列表相应元素++;遍历数组 2,同样将数组元素作为下标,判断该下标处元素是否有数值(在数组 1 中是否存在)。


回答(C 语言):


int countPrimes(int n){    int *isPrime = (int*)malloc(sizeof(int) * n);    memset(isPrime, 0, sizeof(int) * n);    int cnt = 0;     for(int i = 2; i < n; i++){        if(isPrime[i] == 0){            cnt++;            for(int j = i + i; j < n; j += i){  //筛去i的倍数                isPrime[j] = 1;            }        }    }     return cnt;}
复制代码


运行效率如下所示:





第 6 题:计算质数


试题要求如下:



解答思路:


质数是指在大于 1 的自然数中,除了 1 和它本身以外不再有其他因数的自然数。


厄拉多塞筛法:



回答(C 语言):


int countPrimes(int n){    int *isPrime = (int*)malloc(sizeof(int) * n);    memset(isPrime, 0, sizeof(int) * n);    int cnt = 0;     for(int i = 2; i < n; i++){        if(isPrime[i] == 0){            cnt++;            for(int j = i + i; j < n; j += i){  //筛去i的倍数                isPrime[j] = 1;            }        }    }     return cnt;}
复制代码


运行效率如下所示:





第 7 题:旋转数组


试题要求如下:



解答思路:


使用反转数组的方法,例如 k 为 3 时:


原始数组 : 1 2 3 4 5 6 7


反转所有数字后 : 7 6 5 4 3 2 1


反转前 k 个数字后 : 5 6 7 4 3 2 1


反转后 n-k 个数字后 : 5 6 7 1 2 3 4 --> 结果


回答(C 语言):


static void reverse(int* nums, int numsSize, int start, int end){    int temp = 0;     while (start < end)    {        temp = nums[start];        nums[start] = nums[end];        nums[end] = temp;        start++, end--;    }} void rotate(int* nums, int numsSize, int k){    k = k % numsSize;    reverse(nums, numsSize, 0, numsSize - 1);    reverse(nums, numsSize, 0, k - 1);    reverse(nums, numsSize, k, numsSize - 1);}
复制代码


运行效率如下所示:





第 8 题:二叉树的层平均数


试题要求如下:



回答(C 语言):


/** * Definition for a binary tree node. * struct TreeNode { *     int val; *     struct TreeNode *left; *     struct TreeNode *right; * }; */ /** * Note: The returned array must be malloced, assume caller calls free(). */  void helper(struct TreeNode* root, double* sum, double* count, int index, int* head){     if(root==NULL){        return;    }    sum[index] += root->val;    count[index]++;    (*head) = fmax(*head, index);    helper(root->left, sum, count, index+1, head);    helper(root->right, sum, count, index+1, head); } double* averageOfLevels(struct TreeNode* root, int* returnSize){    int NUM = 10000;    double* sum = (double*)calloc(NUM, sizeof(double));    double* count = (double*)calloc(NUM, sizeof(double));     int head = 0;    helper(root, sum, count, 0, &head);    double* ret = (double*)malloc((head+1)*sizeof(double));    for(int i=0; i<head+1; i++) {        ret[i] = sum[i]/count[i];    }     *returnSize = head+1;        return ret;}
复制代码


运行效率如下所示:





第 9 题:修建二叉搜索树


试题要求如下:



回答(C 语言):


/** * Definition for a binary tree node. * struct TreeNode { *     int val; *     struct TreeNode *left; *     struct TreeNode *right; * }; */ struct TreeNode* trimBST(struct TreeNode* root, int L, int R){    if (NULL == root)    {        return NULL;    }     if (root->val < L)    {        return trimBST(root->right, L, R);    }     if (R < root->val)    {        return trimBST(root->left, L, R);    }     root->left = trimBST(root->left, L, R);    root->right = trimBST(root->right, L, R);     return root;}
复制代码


运行效率如下所示:





第 10 题:分糖果


试题要求如下:



回答(C 语言):


int cmpfunc (const void * a, const void * b){   return ( *(int*)a - *(int*)b );} int distributeCandies(int* candies, int candiesSize){    int cou = 0;     qsort(candies, candiesSize, sizeof(int), cmpfunc);        for(int i = 0,j = 1;i < candiesSize-1;i++,j = i+1){        if(candies[i] != candies[j]){            cou++;        }    }     cou++;     if(cou < candiesSize/2){        return cou;    }     return candiesSize/2;}
复制代码


运行效率如下所示:



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

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

【公众号】美男子玩编程

评论

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