目錄
力扣(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;
}
運行效率如下所示: