力扣(LeetCode)刷题,简单题(第13期)
目錄
第1題:字符的最短距離
第2題:棒球比賽
第3題:判定是否互為字符重排
第4題:島嶼的周長
第5題:兩個數組的交集
第6題:計算質數
第7題:旋轉數組
第8題:二叉樹的層平均數
第9題:修建二叉搜索樹
第10題:分糖果
力扣(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語言):
運行效率如下所示:
第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;
}
運行效率如下所示:
總結
以上是生活随笔為你收集整理的力扣(LeetCode)刷题,简单题(第13期)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 5行Python代码实现图像分割
- 下一篇: 新冠疫情下,毕业照怎么拍?10行Pyth